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.

49
demandé sur Sandro Ferreira 2010-03-03 09:36:38

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')
79
répondu APC 2017-06-06 04:17:54

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');
21
répondu Chad Birch 2010-03-03 06:56:45

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

3
répondu Darren Atkinson 2010-03-03 11:39:39

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');
1
répondu Kishore Kumar 2015-03-09 10:17:09

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'))
1
répondu Ajay 2015-03-30 13:45:35