Я пытаюсь заставить его отображать количество сотрудников, нанятых после 20 июня 1994 г., но я получаю сообщение об ошибке "Недействительный идентификатор JUN. Пожалуйста, помогите, спасибо!"
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
> <
илиBETWEEN '' AND ''
Ответы:
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')
У этого метода есть несколько ненужных подводных камней.
DEC
это не обязательно означает декабрь. Это зависит от вашихNLS_DATE_LANGUAGE
иNLS_DATE_FORMAT
настроек. Чтобы убедиться, что ваше сравнение с работой в любой локали, вы можете вместо этого использовать модель формата datetimeMM
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 - 31MM
числовой месяц года, 01 - 12 (01 января)YYYY
Год из четырех цифр - на мой взгляд, это всегда лучше, чем год из двух цифр,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
.источник
DEC
не обязательно всегда действительный месяц. Обычно лучше использовать числа вместо именtimestamp
литерал вместоdate
литерала:timestamp '2015-01-30 19:42:04'
(потому что в ANSI SQLdate
тип данных не имеет времени, а имеет толькоtimestamp
тип данных).DATE 2016-04-01
средства2016-04-01 00:00:00
. И я думаю, что этот синтаксис работает с Oracle 9i, поскольку именно здесь синтаксис ANSI-SQL был введен в Oracle.define
- это команда SQL * Plus, которая заменяет все, что вы определили, во все переменные подстановки с этим именем .ALTER SESSION
- это утверждение, которое позволяет вам изменять некоторые параметры или настройки базы данных на время этого сеанса,Вывод,
to_char
работает по-своемуТак,
Всегда используйте этот формат ГГГГ-ММ-ДД для сравнения вместо ММ-ДД-ГГ или ДД-ММ-ГГГГ или любого другого формата.
источник
Вы можете использовать trunc и to_date следующим образом:
select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* from ils_det_guia dg, ils_guia g where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN and dg.LAB_CODIGO = 56 and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY') order by g.FECHA;
источник
из вашего запроса:
Select employee_id, count(*) From Employee Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95'
Я думаю, это не для отображения количества сотрудников, нанятых после 20 июня 1994 года. Если вы хотите показать количество сотрудников, вы можете использовать:
Select count(*) From Employee Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620
Я думаю, что лучше всего сравнить даты, которые вы можете использовать:
источник
Одинарная кавычка должна быть там, поскольку дата преобразована в символ.
источник