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

Mi TO_DATE parece no funcionar correctamente

Lo más probable es que el problema sea que hay un componente de fecha fraccionaria que no está teniendo en cuenta. Puede ignorar ese componente de fecha fraccionaria truncando la columna en su consulta:

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;

Estoy asumiendo que la columna enroll_date es del tipo de dato DATE.

Alguna explicación:Oracle almacena fechas como se describe aquí , NO almacena una fecha como dice "El formato de fecha ya es DD-MON-YY". Ese es solo el formato en el que ve la fecha, que está determinado por el parámetro NLS_DATE_FORMAT para su sesión.

Hagamos una prueba rápida con una tabla de prueba. Cree una tabla y verifique el formato NLS_DATE_FORMAT de mi sesión.

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

Así es como veré mis fechas.


SELECT * FROM date_tst;

04-OCT-2020

Así que tengo la fecha de hoy. Enfriar. Ahora veamos si puedo consultar usando esa fecha:


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

no rows.

No se muestran filas porque el formato de fecha en el que obtengo mi fecha no tiene un componente de hora. FECHA tiene año, mes, día, hora, minuto y segundos. El formato solo tiene año, mes y día. Vamos a consultar los datos para verificar si hay un componente de tiempo.

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

4-OCT-2020 21:12:39

Ah ahí está... SYSDATE es la hora actual hasta el segundo. Ahora intentemos esa consulta nuevamente con un formato de fecha más 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

Y ahí está nuestra fila. El comando TRUNC cortará el componente de tiempo:

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

04-OCT-2020 00:00:00

Para que puedas simplificar tu consulta:

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

04-OCT-2020