Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wygląda na to, że moje TO_DATE nie działa poprawnie

Najprawdopodobniej problem polega na tym, że istnieje ułamkowy składnik daty, którego nie bierzesz pod uwagę. Możesz zignorować ten ułamkowy składnik daty, obcinając kolumnę w zapytaniu:

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;

Zakładam, że kolumna enroll_date jest typu danych DATE.

Wyjaśnienie:Oracle przechowuje daty zgodnie z opisem tutaj , NIE przechowuje daty, ponieważ podajesz "Format daty, w którym się znajduje, to już DD-MON-RR". Jest to tylko format, w którym widzisz datę, który jest określany przez parametr NLS_DATE_FORMAT dla Twojej sesji.

Zróbmy szybki test z tabelą testową. Utwórz tabelę i sprawdź NLS_DATE_FORMAT z mojej sesji.

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

W ten sposób zobaczę moje daty.


SELECT * FROM date_tst;

04-OCT-2020

Więc mam dzisiejszą datę. Chłodny. Zobaczmy teraz, czy mogę wysłać zapytanie przy użyciu tej daty:


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

no rows.

Nie są wyświetlane żadne wiersze, ponieważ format daty, w którym otrzymuję moją datę, nie zawiera składnika czasu. DATE zawiera rok, miesiąc, dzień, godzinę, minuty i sekundy. Format ma tylko rok, miesiąc i dzień. Przeprowadź zapytanie o dane, aby sprawdzić, czy istnieje składnik czasu.

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

4-OCT-2020 21:12:39

Ach to jest... SYSDATE to aktualny czas do sekundy. Teraz spróbujmy ponownie to zapytanie z bardziej precyzyjnym formatem daty:

SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020 21:12:39','DD-MON-YYYY HH24:MI:SS');

04-OCT-2020

I oto nasza awantura. Polecenie TRUNC odetnie składnik czasu:

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

04-OCT-2020 00:00:00

Możesz więc uprościć zapytanie:

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

04-OCT-2020


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rozwiązywać problemy z wydajnością za pomocą instrukcji Oracle SQL?

  2. Wyłącz wyzwalacz logowania w Oracle

  3. Oracle 11g SQL, aby uzyskać unikalne wartości w jednej kolumnie wielokolumnowego zapytania

  4. Jak zrezygnować z Oracle LOB

  5. Błąd narzędzia migracji Worklight 6.2