sql >> Database teknologi >  >> RDS >> Oracle

Min TO_DATE ser ikke ud til at fungere korrekt

Sandsynligvis er problemet, at der er en deldatokomponent, som du ikke tager højde for. Du kan ignorere denne brøkdatokomponent ved at afkorte kolonnen i din forespørgsel:

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;

Jeg antager, at kolonnen enroll_date er af datatypen DATE.

Nogle forklaringer:Oracle gemmer datoer som beskrevet her , den gemmer IKKE en dato, da du angiver "Datoformatet, den er i, er allerede DD-MÅN-ÅÅ." Det er kun det format, du ser datoen i, som bestemmes af parameteren NLS_DATE_FORMAT for din session.

Lad os lave en hurtig test med en testtabel. Opret tabel og tjek NLS_DATE_FORMAT fra min 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

Sådan vil jeg se mine datoer.


SELECT * FROM date_tst;

04-OCT-2020

Så jeg har dagens date. Fedt nok. Lad os nu se, om jeg kan forespørge ved hjælp af denne dato:


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

no rows.

Der vises ingen rækker, fordi det datoformat, jeg får min dato i, ikke har en tidskomponent. DATE har år, måned, dag, time, minut og sekunder. Formatet har kun år, måned og dag. Lad os forespørge dataene for at kontrollere, om der er en tidskomponent.

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

4-OCT-2020 21:12:39

Ah der er det... SYSDATE er den aktuelle tid op til den anden. Lad os nu prøve den forespørgsel igen med et mere præcist datoformat:

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

04-OCT-2020

Og der er vores række. TRUNC-kommandoen vil afbryde tidskomponenten:

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

04-OCT-2020 00:00:00

Så du kan forenkle din forespørgsel:

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

04-OCT-2020


  1. hvordan man sorterer varchar numeriske kolonner efter DESC eller ASC?

  2. MySQL:Optimering GRUPPER VED flere nøgler

  3. Sådan får du tid fra db afhængigt af forhold

  4. PHP PDO INSERT WHERE NOT EXISTS-sætning virker ikke