Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Mein TO_DATE scheint nicht richtig zu funktionieren

Höchstwahrscheinlich besteht das Problem darin, dass es eine Bruchdatumskomponente gibt, die Sie nicht berücksichtigen. Sie können diese Bruchdatumskomponente ignorieren, indem Sie die Spalte in Ihrer Abfrage abschneiden:

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;

Ich gehe davon aus, dass die Spalte enroll_date ist vom Datentyp DATE.

Einige Erklärungen:Oracle speichert Daten wie hier beschrieben , es speichert KEIN Datum, wenn Sie angeben "Das Datumsformat ist bereits TT-MON-JJ.". Das ist nur das Format, in dem Sie das Datum sehen, das durch den Parameter NLS_DATE_FORMAT für Ihre Sitzung bestimmt wird.

Lassen Sie uns einen schnellen Test mit einer Testtabelle durchführen. Tabelle erstellen und NLS_DATE_FORMAT aus meiner Sitzung überprüfen.

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

So sehe ich meine Daten.


SELECT * FROM date_tst;

04-OCT-2020

Also ich habe das heutige Datum. Kühl. Mal sehen, ob ich mit diesem Datum abfragen kann:


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

no rows.

Es werden keine Zeilen angezeigt, da das Datumsformat, in dem ich mein Datum erhalte, keine Zeitkomponente enthält. DATE hat Jahr, Monat, Tag, Stunde, Minute und Sekunden. Das Format hat nur Jahr, Monat und Tag. Lassen Sie uns die Daten abfragen, um zu prüfen, ob es eine Zeitkomponente gibt.

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

4-OCT-2020 21:12:39

Ah da ist es... SYSDATE ist die aktuelle Zeit auf die Sekunde genau. Versuchen wir es jetzt noch einmal mit einem genaueren Datumsformat:

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

04-OCT-2020

Und da ist unsere Reihe. Der TRUNC-Befehl schneidet die Zeitkomponente ab:

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

04-OCT-2020 00:00:00

So können Sie Ihre Abfrage vereinfachen:

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

04-OCT-2020