sql >> Base de Datos >  >> RDS >> Oracle

Comparando con la fecha en Oracle sql

El problema es doble. En primer lugar, las fechas casi definitivamente tienen componentes de tiempo. to_date('06-MAR-11','DD-MON-YY') es equivalente a 2011/03/06 00:00:00 . Si usa el TRUNC() función podrá ver todo para ese día:

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

Yo no utilice el modelo de formato de fecha y hora MON. Como explico aquí, depende de su región y configuración. En su lugar, es más seguro utilizar un modelo de formato de mes numérico. Igualmente, especifique siempre el siglo como parte del año.

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

Su segundo problema es casi definitivamente su NLS_DATE_FORMAT; parece no tener en cuenta la hora, por lo que ves 4 fechas idénticas. Esto solo rige la forma en que se muestran los datos no cómo se almacena.

Puedes cambiar esto usando algo como:

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

Si configuro un entorno de prueba usando lo siguiente:

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";

Puede ver que los datos devueltos no incluyen la hora (aunque SYSDATE sí):

SQL> select * from test_table;

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

Al alterar NLS_DATE_FORMAT y realizar el mismo SELECT, ahora obtiene un componente de tiempo:

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 último, al intentar seleccionar solo la fecha de hoy, no se devolverán filas:

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

no rows selected

Pero, al usar TRUNC() para comparar solo la parte de la fecha del campo, obtiene todas sus filas nuevamente:

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 responder realmente a su segunda pregunta, si desea fechas únicas, puede reutilizar el TRUNC() función:

select distinct trunc(creation_date)
  from test_table