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

Porównywanie dat w Oracle SQL

31-DEC-95 nie jest ciągiem znaków, podobnie jak 20-JUN-94 . To liczby z dodanymi na końcu dodatkowymi elementami. Powinien to być '31-DEC-95' lub '20-JUN-94' - zwróć uwagę na pojedynczy cudzysłów, ' . Umożliwi to porównanie ciągów znaków.

Jednak nie robisz porównania ciągów; robisz porównanie dat . Powinieneś przekształcić swój ciąg w randkę. Albo za pomocą wbudowanej funkcji TO_DATE() funkcja lub literał daty.

DO_DATA()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Ta metoda ma kilka niepotrzebnych pułapek

  • Jak zauważył a_koń_bez_imienia w komentarzach, DEC , niekoniecznie oznacza grudzień. To zależy od Twojego NLS_DATE_LANGUAGE i NLS_DATE_FORMAT ustawienia. Aby upewnić się, że Twoje porównanie z działaniem w dowolnym języku, możesz użyć modelu formatu daty i godziny MM zamiast tego
  • Rok '95 jest niedokładny. Wiesz, masz na myśli rok 1995, ale co jeśli to był rok pięćdziesiąty, czy to 1950 czy 2050? Zawsze najlepiej jest być jednoznacznym
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Litery dat

Literał daty jest częścią standardu ANSI, co oznacza, że ​​nie musisz używać określonej funkcji Oracle. Używając literału, musisz podaj datę w formacie YYYY-MM-DD i nie możesz dołączyć elementu czasu.

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Pamiętaj, że typ danych Oracle data zawiera element czasu, więc data bez części czasu jest równoważna z 1995-12-31 00:00:00 .

Jeśli chcesz dołączyć część czasu, musisz użyć literału znacznika czasu, który ma format YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

Dalsze informacje

NLS_DATE_LANGUAGE pochodzi z języka NLS_LANGUAGE i NLS_DATE_FORMAT pochodzi z NLS_TERRITORY . Są one ustawiane podczas początkowego tworzenia bazy danych, ale można je zmienić, zmieniając plik parametrów inicjalizacji - tylko wtedy, gdy jest to naprawdę wymagane - lub na poziomie sesji za pomocą ALTER SESSION składnia. Na przykład:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Oznacza to:

  • DD numeryczny dzień miesiąca, 1 - 31
  • MM numeryczny miesiąc roku, 01–12 (styczeń to 01)
  • YYYY 4-cyfrowy rok - moim zdaniem to zawsze lepszy niż 2-cyfrowy rok YY ponieważ nie ma zamieszania z tym, do jakiego wieku się odnosisz.
  • HH24 godzina dnia, 0 - 23
  • MI minuta godziny, 0 - 59
  • SS sekunda minuty, 0-59

Możesz sprawdzić swoje bieżące ustawienia języka i języka daty, wysyłając zapytanie o V$NLS_PARAMETERSs i pełną gamę prawidłowych wartości, wysyłając zapytanie V$NLS_VALID_VALUES .

Dalsze czytanie

  • Modele formatu

Nawiasem mówiąc, jeśli chcesz count(*) musisz pogrupować według employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Daje to liczbę na employee_id .



  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 mogę uzyskać liczbę rekordów, których dotyczy procedura składowana?

  2. Porównanie dostawców zgodnych z Entity Framework dla Oracle?

  3. Jak zainstalować program SQL Developer na komputerze Mac?

  4. SQL Server 2016 w systemie Linux

  5. Jak uzyskać liczbę wierszy, których dotyczy instrukcja, gdy znajduje się w wyzwalaczu tego oświadczenia?