J'ai le tableau ci-dessous:

Tableau Temp:

ID  MAX MIN DATE_C  
1   34  24  21-APR-17 02.41.38.520000 PM    
2   32  26  20-APR-17 02.42.44.569000 PM

J'exécute la requête SQL ci-dessous pour obtenir les détails de la température à la date respective:

SELECT *
FROM Temp t
WHERE t.date_c = TO_DATE( '2017-04-21', 'YYYY-MM-DD')
order by t.id

Mais il renvoie des enregistrements vides. Quel est le problème avec ma requête?

0
SAP DEV 21 avril 2017 à 15:16

3 réponses

Meilleure réponse

Vous devez supprimer le composant de temps sur la colonne. Voici une façon:

SELECT *
FROM Temp t
WHERE TRUNC(t.date_c) = DATE '2017-04-21'
ORDER BY t.id;

Cependant, je recommande généralement d'utiliser des inégalités, plutôt qu'une fonction sur la colonne:

SELECT *
FROM Temp t
WHERE t.date_c >= DATE '2017-04-21' AND
      t.date_c < DATE '2017-04-22'
ORDER BY t.id;

Cela permet à la requête d'utiliser un index sur date_c. Je dois ajouter que la version originale peut utiliser un index sur (trunc(date_c, id).

3
Gordon Linoff 21 avril 2017 à 12:17

21-APR-17 02.41.38.520000 PM n'est pas un DATE; il a un composant de fraction de seconde donc c'est un TIMESTAMP.

Donc, si vous voulez trouver des éléments qui sont un jour particulier (en saisissant le TIMESTAMP en utilisant un Littéral d'horodatage ISO / ANSI):

SELECT *
FROM   Temp
WHERE  date_c >= TIMESTAMP '2017-04-21 00:00:00' AND
       date_c <  TIMESTAMP '2017-04-21 00:00:00' + INTERVAL '1' DAY;

Ou

SELECT *
FROM   Temp
WHERE  date_c >= TO_TIMESTAMP( :your_date_string, 'YYYY-MM-DD' ) AND
       date_c <  TO_TIMESTAMP( :your_date_string, 'YYYY-MM-DD' ) + INTERVAL '1' DAY;

il renvoie des enregistrements vides. Quel est le problème avec ma requête?

date_c = TO_DATE( '2017-04-21', 'YYYY-MM-DD') correspond à toutes les lignes où la valeur date_c est exactement 2017-04-21 00:00:00.000000 (y compris le composant de temps); si vous n'avez aucune ligne avec exactement cette date et heure, comme vous l'avez remarqué, il ne retournera rien. Si vous souhaitez obtenir des enregistrements correspondant à ce jour-là, vous devez obtenir des valeurs dans une plage de temps comprise entre le début et la fin de la journée.

1
MT0 21 avril 2017 à 12:40

Vous devez transmettre la date sur la colonne. Voici un moyen ...

SELECT *
FROM Temp t
WHERE CAST(t.CREATED_ON as date)= N'2017-04-22'
ORDER BY t.id
-3
C B 21 avril 2017 à 15:38