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
настроек. Чтобы убедиться, что ваше сравнение с работой в любой локали, вы можете вместо этого использовать модель формата datetime 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 date включает в себя элемент времени, поэтому дата без временной части эквивалентна 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 ''