Название дня, дополненное пробелами, препятствует правильному поведению

Я пытаюсь перейти в условие 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');
Другие вопросы по тегам