Оракул, где пункт не работает с 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''')

SQL Fiddle demo

Модели формата описаны в документации.

Ваше 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;
Другие вопросы по тегам