Confronto con la data in Oracle sql

Ho una colonna 'creation_date' che è di tipo 'date' , quando sto interrogando la mia tabella per i record distinti basati su 'creation_date' Sto ricevendo 6 record:

 select distinct creation_date from test_table; 

produzione:

 06-APR-11 06-APR-11 28-MAR-11 06-APR-11 06-APR-11 18-MAR-11 

In questa uscita il 6 aprile viene visualizzato 4 volte anche quando ho usato distinti nella mia query. Inoltre, quando sto cercando di scoprire tutti i record che corrispondono alla data di creation_date del 6th April 2011 non ho alcun risultato. Di seguito è la mia domanda:

 select * from test_table where creation_date = to_date('06-APR-11','DD-MON-YY'); 

Per favore aiutami dove sto sbagliando in queste due domande.

    Il problema è duplice. Innanzitutto le date hanno quasi sicuramente componenti temporali. to_date('06-MAR-11','DD-MON-YY') equivale a 2011/03/06 00:00:00 . Se usi la funzione TRUNC() potrai vedere tutto per quel giorno:

     select * from test_table where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY'); 

    Non userei il modello di formato datetime MON. Come spiego qui dipende dalla tua regione e dalle impostazioni. È più sicuro utilizzare invece un modello di formato numerico mensile. Allo stesso modo, specificare sempre il secolo come parte dell’anno.

     where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY'); 

    Il tuo secondo problema è quasi sicuramente il tuo NLS_DATE_FORMAT ; sembra non tener conto del tempo, quindi perché vedi 4 date identiche. Questo regola solo il modo in cui i dati vengono visualizzati non come viene memorizzato.

    Puoi cambiarlo usando qualcosa come:

     ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS" 

    Se imposto un ambiente di test utilizzando quanto segue:

     create table test_table ( creation_date date ); insert into test_table values ( sysdate ); insert into test_table values ( sysdate - 0.01 ); alter session set nls_date_format = "YYYY/MM/DD"; 

    Puoi vedere che i dati restituiti non includono il tempo (sebbene SYSDATE lo faccia):

     SQL> select * from test_table; CREATION_D ---------- 2013/04/12 2013/04/12 

    Alterando il NLS_DATE_FORMAT ed eseguendo la stessa SELECT, ora ottieni un componente orario:

     SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS"; Session altered. SQL> select * from test_table; CREATION_DATE ------------------- 2013/04/12 12:48:41 2013/04/12 12:34:17 

    Infine, quando provi a selezionare solo la data odierna, non verranno restituite righe:

     SQL> select * 2 from test_table 3 where creation_date = to_date('20130412','yyyymmdd'); no rows selected 

    Tuttavia, quando si utilizza TRUNC() per confrontare solo la porzione di data del campo, si ottengono di nuovo tutte le righe:

     SQL> select * 2 from test_table 3 where trunc(creation_date) = to_date('20130412','yyyymmdd'); CREATION_DATE ------------------- 2013/04/12 12:48:41 2013/04/12 12:34:17 

    Per rispondere effettivamente alla tua seconda domanda, se vuoi date uniche puoi riutilizzare la funzione TRUNC() :

     select distinct trunc(creation_date) from test_table 

    Il datatype DATE memorizza l’anno (incluso il secolo), il mese, il giorno, le ore, i minuti e i secondi (dopo la mezzanotte). Devi anche considerare questo.