Оракул, где пункт не работает с sysdate
Пожалуйста, помогите мне, DAY_ID - это поле базы данных, которое содержит 1-7 цифр. 1 для понедельника, 2 для вторника и так далее.
DECLARE
V_DAY_ID NUMBER(1) :=0;
BEGIN
SELECT DAY_ID INTO V_DAY_ID FROM DAYS WHERE DAY_NAME = TO_CHAR(SYSDATE,'DAY');
END;
Этот запрос не работает, пожалуйста, помогите...
2 ответа
По умолчанию Oracle дополняет имена дней до самых длинных в языке дат сеанса (таким образом, 9 на английском языке). Вы можете изменить это с помощью FM
модифер.
Вы также должны соответствовать случаю, и с значениями, которые вы показали, вам нужно Day
(который дает, например, "воскресенье"), а не DAY
('ВОСКРЕСЕНЬЕ'):
TO_CHAR(SYSDATE,'FMDay')
или если значения на самом деле являются заглавными (вы показали оба!):
TO_CHAR(SYSDATE,'FMDAY')
Но вы также не должны предполагать, что тот, кто вызывает это, использует английский в своем сеансе, укажите, что вы хотите, чтобы английское название дня совпадало с тем, что есть в вашей таблице:
TO_CHAR(SYSDATE,'FMDAY','NLS_DATE_LANGUAGE=''ENGLISH''')
Модели формата описаны в документации.
Ваше DAY_NAME не сохраняется в верхнем регистре, поэтому в условии добавьте функцию UPPER (и значение TRIM, чтобы игнорировать пробелы)
DECLARE
V_DAY_ID NUMBER(1) :=0;
BEGIN
SELECT DAY_ID INTO V_DAY_ID FROM DAYS WHERE UPPER(DAY_NAME) = TRIM(TO_CHAR(SYSDATE,'DAY'));
END;