Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Comparando com data no Oracle sql


O problema é duplo. Em primeiro lugar, as datas quase definitivamente têm componentes de tempo. to_date('06-MAR-11','DD-MON-YY') é equivalente a 2011/03/06 00:00:00 . Se você usar o TRUNC() função você poderá ver tudo para aquele dia:
select * 
  from test_table
 where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');

Eu não use o modelo de formato de data e hora MON. Como explico aqui, depende da sua região e configurações. É mais seguro usar um modelo de formato de mês numérico. Da mesma forma, sempre especifique o século como parte do ano.
where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');

Seu segundo problema é quase definitivamente seu NLS_DATE_FORMAT; parece não levar em conta a hora, por isso você vê 4 datas idênticas. Isso rege apenas a maneira como os dados são exibidos não como ele é armazenado.

Você pode alterar isso usando algo como:
ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"

Se eu configurar um ambiente de teste usando o seguinte:
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";

Você pode ver que os dados retornados não incluem o tempo (embora SYSDATE inclua):
SQL> select * from test_table;

CREATION_D
----------
2013/04/12
2013/04/12

Alterando o NLS_DATE_FORMAT e realizando o mesmo SELECT, agora você obtém um componente de hora:
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

Por fim, ao tentar selecionar apenas a data de hoje, nenhuma linha será retornada:
SQL> select *
  2    from test_table
  3   where creation_date = to_date('20130412','yyyymmdd');

no rows selected

Mas, ao usar TRUNC() para comparar apenas na parte de data do campo, você obtém todas as suas linhas novamente:
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

Para realmente responder à sua segunda pergunta, se você quiser datas exclusivas, você pode reutilizar o TRUNC() função:
select distinct trunc(creation_date)
  from test_table