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 ''