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

Il mio TO_DATE sembra non funzionare correttamente

Molto probabilmente il problema è che c'è un componente di data frazionaria che non stai prendendo in considerazione. Puoi ignorare quel componente di data frazionaria troncando la colonna nella tua query:

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;

Presumo che la colonna enroll_date è del tipo di dati DATE.

Qualche spiegazione:Oracle memorizza le date come descritto qui , NON memorizza una data poiché dichiari "Il formato della data è già DD-MON-YY.". Questo è solo il formato in cui vedi la data, determinato dal parametro NLS_DATE_FORMAT per la tua sessione.

Facciamo un rapido test con una tabella di test. Crea una tabella e controlla NLS_DATE_FORMAT dalla mia sessione.

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

Ecco come vedrò le mie date.


SELECT * FROM date_tst;

04-OCT-2020

Quindi ho la data di oggi. Freddo. Ora vediamo se riesco a interrogare utilizzando quella data:


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

no rows.

Non vengono mostrate righe perché il formato della data in cui ottengo la mia data non ha un componente temporale. DATE contiene Anno, mese, giorno, ora, minuti e secondi. Il formato ha solo anno, mese e giorno. Consente di interrogare i dati per verificare se esiste una componente temporale.

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

4-OCT-2020 21:12:39

Ah eccolo... SYSDATE è l'ora corrente fino al secondo. Ora proviamo di nuovo quella query con un formato di data più preciso:

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

04-OCT-2020

E c'è la nostra fila. Il comando TRUNC taglierà la componente temporale:

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

04-OCT-2020 00:00:00

Quindi puoi semplificare la tua richiesta:

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

04-OCT-2020