Oracle
 sql >> Base de données >  >> RDS >> Oracle

Mon TO_DATE semble ne pas fonctionner correctement

Le problème est probablement qu'il existe un composant de date fractionnaire que vous ne prenez pas en compte. Vous pouvez ignorer ce composant de date fractionnaire en tronquant la colonne dans votre requête :

SELECT section_id, COUNT(student_id) "ENROLLED"
FROM enrollment
WHERE TRUNC(enroll_date) = TO_DATE('2/10/2007', 'MM/DD/YYYY')
GROUP BY section_id
ORDER BY ENROLLED;

Je suppose que la colonne enroll_date est du type de données DATE.

Quelques explications :Oracle stocke les dates comme décrit ici , il ne stocke PAS de date lorsque vous indiquez "Le format de date dans lequel il se trouve est déjà JJ-MON-AA.". Il s'agit uniquement du format dans lequel vous voyez la date, qui est déterminé par le paramètre NLS_DATE_FORMAT pour votre session.

Faisons un test rapide avec une table de test. Créez une table et vérifiez le formulaire NLS_DATE_FORMAT de ma session.

create table DATE_TST 
( id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  test_date DATE
);

INSERT INTO date_tst (test_date) VALUES (SYSDATE);

SELECT value
FROM   nls_session_parameters
WHERE  parameter = 'NLS_DATE_FORMAT';

DD-MON-YYYY

C'est ainsi que je verrai mes dates.


SELECT * FROM date_tst;

04-OCT-2020

J'ai donc la date d'aujourd'hui. Cool. Voyons maintenant si je peux interroger en utilisant cette date :


SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020','DD-MON-YYYY');

no rows.

Aucune ligne n'est affichée car le format de date dans lequel j'obtiens ma date n'a pas de composante temporelle. DATE a l'année, le mois, le jour, l'heure, les minutes et les secondes. Le format n'a que l'année, le mois et le jour. Interrogeons les données pour vérifier s'il y a une composante temporelle.

SELECT TO_CHAR(test_date,'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

4-OCT-2020 21:12:39

Ah ça y est... SYSDATE est l'heure actuelle jusqu'à la seconde. Essayons maintenant à nouveau cette requête avec un format de date plus précis :

SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020 21:12:39','DD-MON-YYYY HH24:MI:SS');

04-OCT-2020

Et voilà notre rangée. La commande TRUNC coupera la composante temporelle :

SELECT TO_CHAR(TRUNC(test_date),'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

04-OCT-2020 00:00:00

Vous pouvez ainsi simplifier votre requête :

SELECT * FROM date_tst WHERE TRUNC(test_date) = TO_DATE('04-OCT-2020','DD-MON-YYYY');

04-OCT-2020