31-DEC-95
nie jest ciągiem ani nim nie jest 20-JUN-94
. To liczby z dodatkowymi rzeczami na końcu. Powinno to być '31-DEC-95'
albo '20-JUN-94'
- zwrócić uwagę na jeden cytat, '
. Umożliwi to wykonanie porównania ciągów.
Jednak nie robisz porównania ciągów; porównujesz daty . Powinieneś przekształcić swój ciąg w datę. Albo używając funkcji wbudowanej TO_DATE()
, albo literału daty .
SPOTYKAĆ SIĘ Z KIMŚ()
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żono w komentarzach a_horse_with_no_name
DEC
, niekoniecznie oznacza grudzień. To zależy od twoich NLS_DATE_LANGUAGE
i NLS_DATE_FORMAT
ustawień. Aby mieć pewność, że porównanie będzie działać w dowolnej lokalizacji, można zamiast tego użyć modelu formatu daty i godzinyMM
- Rok 95 jest niedokładny. Wiesz, że masz na myśli rok 1995, ale co by było, gdyby był rok 50, czy to 1950 czy 2050? Zawsze najlepiej jest mówić wprost
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Literały daty
Literał daty jest częścią standardu ANSI, co oznacza, że nie musisz używać funkcji specyficznej dla Oracle. Używając literału, musisz określić swoją 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 zawiera element czasu, więc data bez części czasu jest równoważna 1995-12-31 00:00:00
.
Jeśli chcesz uwzględnić część czasu, musisz użyć literału datownika, który przyjmuje 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'
Dalsza informacja
NLS_DATE_LANGUAGE
pochodzi z 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 jeśli jest to naprawdę wymagane - lub na poziomie sesji przy użyciu ALTER SESSION
składni. Na przykład:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
To znaczy:
DD
numeryczny dzień miesiąca, 1-31
MM
numeryczny miesiąc roku, 01-12 (styczeń to 01)
YYYY
4-cyfrowy rok - moim zdaniem jest to zawsze lepsze niż rok 2-cyfrowy, YY
ponieważ nie ma wątpliwości, do jakiego wieku się odnosisz.
HH24
godzina dnia, 0 - 23
MI
minuta godziny, 0 - 59
SS
sekunda minuty, 0-59
Możesz sprawdzić swój bieżący język i ustawienia języka daty, wysyłając zapytanie, V$NLS_PARAMETERSs
a pełną gamę prawidłowych wartości, wysyłając zapytanie V$NLS_VALID_VALUES
.
Dalsza lektura
Nawiasem mówiąc, jeśli chcesz count(*)
, musisz pogrupować wedługemployee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
To daje liczbę na employee_id
.
> <
lubBETWEEN '' AND ''