Как сравнить день недели со строкой в ​​операторах IF? - PullRequest
1 голос
/ 21 октября 2019

Мне нужно использовать IF для сравнения даты (формата дня) со строкой 'SUNDAY', которая есть сегодня. Если сегодня воскресенье, то при распечатке кода по-прежнему печатается оператор ELSE. Сегодня воскресенье, но все равно говорится, что это не воскресенье.

my pl/sql code

Ожидается оператор IF, а не оператор ELSE

Ответы [ 2 ]

3 голосов
/ 21 октября 2019

Выход to_char(datetime) по умолчанию заполнен пробелами:

SQL> select '"'||to_char(sysdate,'DAY')||'"' as actual_value from dual;

ACTUAL_VALUE
--------------------------------------
"SUNDAY   "

Этого можно избежать с помощью модификатора fm:

SQL> select '"'||to_char(sysdate,'fmDAY')||'"' as actual_value from dual;

ACTUAL_VALUE
--------------------------------------
"SUNDAY"

Однако это безопаснееуказать язык даты, если для сеанса не задано значение по умолчанию на английском языке (и более эффективно указать более короткий формат):

SQL> alter session set nls_date_language = German;

SQL> select '"'||to_char(sysdate,'fmDAY')||'"' as actual_value from dual;

ACTUAL_VALUE
------------------------------------------
"SONNTAG"

Короче ('DY' вместо 'DAY') ибезопаснее (обеспечивает 'SUN', а не 'SON', 'DIM' и т. д.):

SQL> select '"'||to_char(sysdate,'DY','nls_date_language = English')||'"' as actual_value from dual;

ACTUAL_VALUE
--------------
"SUN"
1 голос
/ 21 октября 2019

Проблема TO_CHAR(..., 'DAY'). Возвращает строку фиксированной длины независимо от дня недели. Длина зависит от NLS_DATE_LANGUAGE. Например, для английского языка самое длинное название дня недели - WEDNESDAY, что составляет девять символов. Затем, для любого другого дня недели, TO_CHAR(..., 'DAY') возвращает строку такой же длины (девять символов для английского языка), добавляя при необходимости правые пробелы.

Самый простой способ исправить код -чтобы обернуть левую часть ваших сравнений в TRIM().

В вашем коде есть куча странных вещей (например, в ветке ELSE вы должны сказать: «сегодня не воскресенье»), а не "сегодня нет ... что бы ни возвращало TO_CHAR"), но это не то, что вы просили. Ответ на ваш вопрос и не более приведен выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...