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_LANGUAGE
iNLS_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 godzinyMM
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 - 31MM
numeryczny miesiąc roku, 01–12 (styczeń to 01)YYYY
4-cyfrowy rok - moim zdaniem to zawsze lepszy niż 2-cyfrowy rokYY
ponieważ nie ma zamieszania z tym, do jakiego wieku się odnosisz.HH24
godzina dnia, 0 - 23MI
minuta godziny, 0 - 59SS
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
.