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

Confronto con la data in Oracle sql

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

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

Io non utilizzare il modello di formato data e ora MON. Come spiego qui, dipende dalla tua regione e dalle impostazioni. È invece più sicuro utilizzare un modello di formato mese numerico. Allo stesso modo, specifica 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 tenere conto dell'ora, quindi perché vedi 4 date identiche. Questo regola solo il modo in cui i dati vengono visualizzati non come è memorizzato.

Puoi cambiarlo usando qualcosa come:

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

Se ho impostato 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

Modificando NLS_DATE_FORMAT ed eseguendo lo stesso SELECT, ora ottieni una componente temporale:

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 si tenta di 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 parte della data del campo, ottieni di nuovo tutte le tue 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 univoche puoi riutilizzare il TRUNC() funzione:

select distinct trunc(creation_date)
  from test_table