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 )YYYY
4-цифрена година - според мен това е винаги по-добре от двуцифрена година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
.