Название дня, дополненное пробелами, препятствует правильному поведению
Я пытаюсь перейти в условие if в PLSQL, когда определенные даты указаны в определенный день недели.
DECLARE
v_gebDatum CONSTANT DATE := to_date('21-01-1995', 'dd-MM-yyyy');
v_mathDatum DATE := v_gebDatum;
v_huidigeDag VARCHAR2(20);
v_teller number := 0;
BEGIN
WHILE to_char(v_mathDatum, 'yyyy') < to_char(sysdate, 'yyyy')
LOOP
v_mathDatum := add_months(v_mathDatum, 12);
v_huidigeDag := to_char(v_mathDatum, 'DAY');
dbms_output.put_line(v_huidigeDag);
IF v_huidigeDag IN('ZATERDAG', 'ZONDAG')
THEN
dbms_output.put_line(v_mathDatum);
END IF;
END LOOP;
END;
Проблема в том, что я не могу заставить это работать. При печати v_huidigeDag у него явно есть значения 'ZATERDAG и'ZONDAG'в некоторых из напечатанных строк.
Похоже, что по какой-то причине, когда я печатал значения для названий дней, программа добавляла пробелы. Я предполагаю, что для моего самого длинного имени дня ('DONDERSDAG') в моей локали требуется длина символа. И все с меньшим количеством символов, чем это добавляет пробелы. Таким образом, затердаг становится = 'ZATERDAG ', а зондаг становится = 'ZONDAG '. Сейчас это работает, но знает ли кто-нибудь простой способ предотвратить это?
1 ответ
Проблема с DAY
формат. Согласно документации формата даты:
ДЕНЬ
Название дня, дополненное пробелами, для отображения ширины самого широкого имени дня на языке дат, используемом для этого элемента.
Чтобы отключить это поведение, вы должны использовать FM
модификатор:
FM
В элементе формата datetime функции TO_CHAR этот модификатор подавляет пробелы в последующих символьных элементах (таких как MONTH) и подавляет начальные нули для последующих числовых элементов (таких как MI) в модели формата даты. Без FM результат символьного элемента всегда заполняется справа пробелами фиксированной длины, а начальные нули всегда возвращаются для числового элемента. С FM, который подавляет пустое заполнение, длина возвращаемого значения может варьироваться.
В вашем конкретном случае:
v_huidigeDag := to_char(v_mathDatum, 'fmDAY');