31-DEC-95не є рядком, і не є 20-JUN-94. Вони номери з деякими додатковими матеріалами, доданими в кінці. Це повинно бути '31-DEC-95'або '20-JUN-94'- зверніть увагу на апостроф, '. Це дозволить вам порівняти рядки.
Однак ти не робиш порівняння рядків; ви робите порівняння побачень . Ви повинні перетворити рядок у дату. Або за допомогою вбудованої TO_DATE()функції або літералу дати .
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 - 31
MM числовий місяць року, 01 - 12 (січень - 01)
YYYYЧотиризначний рік - на мою думку, це завжди краще, ніж двозначний рік, YYоскільки немає плутанини з тим, до якого століття ви звертаєтесь.
HH24 година дня, 0 - 23
MI хвилина години, 0 - 59
SS секунди хвилини, 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 .
> <абоBETWEEN '' AND ''