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 TwojegoNLS_DATE_LANGUAGEiNLS_DATE_FORMATustawienia. Aby upewnić się, że Twoje porównanie z działaniem w dowolnym języku, możesz użyć modelu formatu daty i godzinyMMzamiast 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:
DDnumeryczny dzień miesiąca, 1 - 31MMnumeryczny miesiąc roku, 01–12 (styczeń to 01)YYYY4-cyfrowy rok - moim zdaniem to zawsze lepszy niż 2-cyfrowy rokYYponieważ nie ma zamieszania z tym, do jakiego wieku się odnosisz.HH24godzina dnia, 0 - 23MIminuta godziny, 0 - 59SSsekunda 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 .