31-DEC-95 не е низ, нито 20-JUN-94 . Те са числа с добавени някои допълнителни неща в края. Това трябва да бъде '31-DEC-95' или '20-JUN-94' - обърнете внимание на единичните кавички, ' . Това ще ви позволи да направите сравнение на низове.
Въпреки това, вие не правите сравнение на низове; правите сравнение на дати . Трябва да трансформирате низа си в дата. Или с помощта на вградения TO_DATE() функция или литерал за дата.
ДО_ДАТА()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Този метод има няколко ненужни клопки
- Както a_horse_with_no_name е отбелязано в коментарите,
DEC, не означава непременно декември. Зависи от вашияNLS_DATE_LANGUAGEиNLS_DATE_FORMATнастройки. За да сте сигурни, че сравнението ви с работи във всеки локал, можете да използвате модела за формат за дата и часMMвместо това - Годината '95 е неточна. Знаеш, че имаш предвид 1995 г., но какво ще стане, ако беше '50, 1950 или 2050? Винаги е най-добре да бъдете изрични
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Литерали за дата
Литералът за дата е част от стандарта ANSI, което означава, че не е нужно да използвате специфична функция на Oracle. Когато използвате литерал, трябва посочете датата си във формат YYYY-MM-DD и не можете да включите времеви елемент.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Не забравяйте, че типът данни за дата на Oracle включва елемент от време, така че датата без времева част е еквивалентна на 1995-12-31 00:00:00 .
Ако искате да включите времева част, тогава ще трябва да използвате литерал за времеви отпечатък, който приема формата YYYY-MM-DD HH24:MI:SS[.FF0-9]
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
Допълнителна информация
NLS_DATE_LANGUAGE е извлечен от NLS_LANGUAGE и NLS_DATE_FORMAT е извлечен от NLS_TERRITORY . Те се задават, когато първоначално сте създали базата данни, но могат да бъдат променени чрез промяна на вашия файл с параметри за инициализация - само ако наистина е необходимо - или на ниво сесия с помощта на ALTER SESSION синтаксис. Например:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Това означава:
DDчислов ден от месеца, 1 - 31MMчислов месец в годината, 01 - 12 ( януари е 01 )YYYY4-цифрена година - според мен това е винаги по-добре от двуцифрена годинаYYтъй като няма объркване за кой век имате предвид.HH24час от деня, 0 - 23MIминута от часа, 0 - 59SSсекунда от минутата, 0-59
Можете да разберете текущите си настройки за език и дата, като направите заявка за V$NLS_PARAMETERSs и пълната гама от валидни стойности чрез заявка за V$NLS_VALID_VALUES .
Допълнително четене
- Форматирайте модели
Между другото, ако искате count(*) трябва да групирате по employee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Това ви дава броя на employee_id .