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

Meu TO_DATE parece não funcionar corretamente


Provavelmente, o problema é que há um componente de data fracionária que você não está levando em consideração. Você pode ignorar esse componente de data fracionária truncando a coluna em sua 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;

Estou assumindo que a coluna enroll_date é do tipo de dados DATE.

Algumas explicações:a Oracle armazena datas conforme descrito aqui , ele NÃO armazena uma data conforme você afirma "O formato de data em que já está é DD-MON-YY.". Esse é apenas o formato em que você vê a data, que é determinado pelo parâmetro NLS_DATE_FORMAT para sua sessão.

Vamos fazer um teste rápido com uma mesa de teste. Crie a tabela e verifique o formulário NLS_DATE_FORMAT da minha sessão.
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

É assim que vou ver minhas datas.

SELECT * FROM date_tst;

04-OCT-2020

Então eu tenho a data de hoje. Legal. Agora vamos ver se consigo consultar usando essa data:

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

no rows.

Nenhuma linha é mostrada porque o formato de data em que recebo minha data não tem um componente de hora. DATE tem Ano, mês, dia, hora, minuto e segundos. O formato só tem ano, mês e dia. Permite consultar os dados para verificar se existe um componente de tempo.
SELECT TO_CHAR(test_date,'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

4-OCT-2020 21:12:39

Ah aí está... SYSDATE é a hora atual até o segundo. Agora vamos tentar essa consulta novamente com um formato de data mais 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

E aí está a nossa fila. O comando TRUNC cortará o componente de tempo:
SELECT TO_CHAR(TRUNC(test_date),'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

04-OCT-2020 00:00:00

Assim, você pode simplificar sua consulta:
SELECT * FROM date_tst WHERE TRUNC(test_date) = TO_DATE('04-OCT-2020','DD-MON-YYYY');

04-OCT-2020