sql >> Databasteknik >  >> RDS >> Oracle

Min TO_DATE verkar inte fungera korrekt

Sannolikt är problemet att det finns en deldatumskomponent som du inte tar hänsyn till. Du kan ignorera den deldatumskomponenten genom att trunkera kolumnen i din fråga:

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;

Jag antar att kolumnen enroll_date är av datatypen DATE.

Lite förklaring:Oracle lagrar datum enligt beskrivningen här , det lagrar INTE ett datum eftersom du anger "Datumformatet är redan DD-MÅN-ÅÅ." Det är bara formatet du ser datumet i, vilket bestäms av parametern NLS_DATE_FORMAT för din session.

Låt oss göra ett snabbt test med ett testbord. Skapa tabell och kontrollera NLS_DATE_FORMAT från 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å här kommer jag att se mina datum.


SELECT * FROM date_tst;

04-OCT-2020

Så jag har dagens dejt. Häftigt. Låt oss nu se om jag kan fråga med det datumet:


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

no rows.

Inga rader visas eftersom datumformatet jag hämtar mitt datum i inte har en tidskomponent. DATUM har år, månad, dag, timme, minut och sekunder. Formatet har bara år, månad och dag. Låt oss fråga data för att kontrollera om det finns en tidskomponent.

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

4-OCT-2020 21:12:39

Ah där är det... SYSDATE är den aktuella tiden fram till den andra. Låt oss nu försöka med den frågan igen med ett mer exakt datumformat:

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

04-OCT-2020

Och där är vår rad. TRUNC-kommandot stänger av 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 förenkla din fråga:

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

04-OCT-2020


  1. Skapa en vy i SQL Server 2017

  2. Skalär UDF Inlining i SQL Server 2019

  3. Ändra Django utvecklingsdatabas från standard SQLite till PostgreSQL

  4. Kapslad Set Model Php-bibliotek