Oracle date requête" entre"
j'utilise la base de données oracle. je veux exécuter une requête pour vérifier les données entre les deux dates.
NAME START_DATE
------------- -------------
Small Widget 15-JAN-10 04.25.32.000000 PM
Product 1 17-JAN-10 04.31.32.000000 PM
select * from <TABLENAME> where start_date
BETWEEN '15-JAN-10' AND '17-JAN-10'
mais je ne reçois aucun résultat de la requête ci-dessus. Je pense que je dois utiliser "j'aime" et "%". Mais je ne sais pas où les utiliser. S'il vous plaît jeter quelques lumières sur cette.
merci d'avance.
5 réponses
à en juger par votre sortie, il semble que vous ayez défini START_DATE comme horodatage. Si C'était une date régulière Oracle serait en mesure de gérer la conversion implicite. Mais comme il n'est pas nécessaire de lancer explicitement ces chaînes pour être des dates.
SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
2 /
Session altered.
SQL>
SQL> select * from t23
2 where start_date between '15-JAN-10' and '17-JAN-10'
3 /
no rows selected
SQL> select * from t23
2 where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
3 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
SQL>
mais nous n'avons toujours qu'une rangée. C'est parce que START_DATE a un élément time. Si nous ne spécifions pas la composante temporelle, Oracle la fixe par défaut à minuit. C'est très bien pour le de côté du BETWEEN
mais pas pour le jusqu'à côté:
SQL> select * from t23
2 where start_date between to_date('15-JAN-10')
3 and to_date('17-JAN-10 23:59:59')
4 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
Product 1 17-JAN-10 04.31.32.000
SQL>
modifier
si vous ne pouvez pas passer dans la composante de temps il ya un couple de choix. L'une consiste à modifier la clause "WHERE" pour supprimer l'élément temporel des critères:
where trunc(start_date) between to_date('15-JAN-10')
and to_date('17-JAN-10')
cela pourrait avoir un impact sur la performance, car cela disqualifie Tout B-tree index sur START_DATE. Vous devez construisez un index basé sur la fonction à la place.
vous pouvez aussi ajouter l'élément time à la date dans votre code:
where start_date between to_date('15-JAN-10')
and to_date('17-JAN-10') + (86399/86400)
en raison de ces problèmes beaucoup de gens préfèrent éviter l'utilisation de between
en vérifiant les limites de date comme ceci:
where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')
vous devez convertir ceux-ci en dates réelles au lieu de chaînes, essayez ceci:
SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('2010-01-15','YYYY-MM-DD') AND TO_DATE('2010-01-17', 'YYYY-MM-DD');
modifié pour traiter du format spécifié:
SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('15-JAN-10','DD-MON-YY') AND TO_DATE('17-JAN-10','DD-MON-YY');
comme APC l'a fait remarquer à juste titre, votre colonne start_date semble être un TIMESTAMP mais il pourrait s'agir d'un TIMESTAMP avec TIMEZONE LOCAL ou TIMESTAMP avec TIMEZONE dataype aussi. Ceux-ci pourraient bien influencer toutes les requêtes que vous faites sur les données si votre serveur de base de données était dans un fuseau horaire différent de vous-même. Cependant, restons simples et supposons que vous êtes dans le même fuseau horaire que votre serveur. Tout d'abord, pour vous donner la confiance, vérifiez que start_date est un type de données TIMESTAMP.
utilisez la commande SQLPlus DESCRIBE (ou l'équivalent dans votre IDE) pour vérifier que cette colonne est un type de données TIMESTAMP.
eg
DESCRIBE mytable
devrait déclarer:
Name Null? Type
----------- ----- ------------
NAME VARHAR2(20)
START_DATE TIMESTAMP
si elle est rapportée comme un Type = TIMESTAMP alors vous pouvez interroger vos plages de dates avec la plus simple conversion de date TO_TIMESTAMP, une qui ne nécessite aucun argument (ou image).
nous utilisez TO_TIMESTAMP pour s'assurer que tout index sur la colonne START_DATE est pris en compte par l'optimiseur. La réponse D'APC a également noté qu'un index basé sur la fonction aurait pu être créé sur cette colonne et que cela influencerait le prédicat SQL, mais nous ne pouvons pas commenter cela dans cette requête. Si vous voulez savoir comment trouver quels index ont été appliqués à table, postez une autre question et nous pouvons répondre que séparément.
donc, en supposant qu'il y ait un index sur start_date, qui est un TIMESTAMP type de données et vous voulez que l'optimiseur de le considérer, votre SQL serait:
select * from mytable where start_date between to_timestamp('15-JAN-10') AND to_timestamp('17-JAN-10')+.9999999
+.999999999 est très proche de mais n'est pas tout à fait 1 de sorte que la conversion du 17-JAN-10 sera aussi proche de minuit que possible ce jour-là, donc vous requête renvoie les deux lignes.
la base de données verra L'intervalle à partir de 15-JAN-10 00:00:00:0000000 to 17-JAN-10 23:59:59:99999 et donc inclure toutes les dates du 15, 16 et 17 janvier 2010 quelle que soit la composante temporelle de l'horodatage.
Espère que ça aide.
Dazzer
Date Entre La Requête
SELECT *
FROM emp
WHERE HIREDATE between to_date (to_char(sysdate, 'yyyy') ||'/09/01', 'yyyy/mm/dd')
AND to_date (to_char(sysdate, 'yyyy') + 1|| '/08/31', 'yyyy/mm/dd');
la requête suivante peut également être utilisée:
select *
from t23
where trunc(start_date) between trunc(to_date('01/15/2010','mm/dd/yyyy')) and trunc(to_date('01/17/2010','mm/dd/yyyy'))