2014-11-29 3 views
-1

Я пытаюсь перейти в условие 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 становится = 'ZATERDAG', а zondag становится = 'ZONDAG'. Теперь он работает, но знает ли кто-нибудь простой способ предотвратить это?

+2

возможно дубликат [Issue при сравнении результата к \ _char (MyDate, 'день') в строку] (http://stackoverflow.com/questions/13269676/вопрос-когда-сравнения-результат-оф-к-charmydate день к струне) –

ответ

1

Проблема с форматом DAY. Согласно date format documentation:

ДЕНЬ

Наименования дня, дополняется пробелами, чтобы отобразить ширин самого широкого имени дня на языке даты, используемый для этого элемента.

Чтобы отключить это поведение, вы должны использовать FM modifier:

FM

В формате даты и времени элемента функции TO_CHAR, этот модификатор подавляет пробелы в последующих элементов символов (такой как MONTH) и подавляет ведущие нули для последующих элементов количества (например, MI) в модели формата даты. Без FM результат символьного элемента всегда правильно дополняется пробелами до фиксированной длины, и ведущие нули всегда возвращаются для элемента с числами. С FM, который подавляет пустую прописку, длина возвращаемого значения может варьироваться от.

В вашем конкретном случае:

v_huidigeDag := to_char(v_mathDatum, 'fmDAY'); 
Смежные вопросы