2013-06-15 6 views

ответ

2

Это не работает, потому что вы не используете format model modifier, fm, в вашей модели. Поскольку вы не используете модификатор модели формата, дни недели правильно заполняются пробелами до 9 символов (длина самой длинной среды). Это, в свою очередь, означает, что ваш тест на равенство неверен.

Для того, чтобы исправить это с помощью модели формата модификатор:

to_char(date1, 'fmDay') 

Вы можете запустить этот запрос для демонстрации как проблемы и решения:

with a_week as (
    select sysdate - level as dy 
    from dual 
connect by level <= 7) 
select dy 
    , to_char(dy, 'Day') 
    , length(to_char(dy, 'Day')) 
    , to_char(dy, 'fmDay') 
    , length(to_char(dy, 'fmDay')) 
    from a_week 

См this SQL Fiddle

Сказав, что я не буду беспокоиться. Зачем вам нужно печатать весь день? Используйте модель формата DY вместо:

if to_char(date1,'DY') = 'SUN' or to_char(date2,'DY') = 'SUN' then 
    ... 

Это всегда длинные три символа.

Однократное примечание при отладке. Если вы знаете, что первый оператор IF не выполняется должным образом, я бы выполнил следующие этапы:

  1. Выньте тест из инструкции IF и поместите его в SELECT. Убедитесь, что две вещи, которые вы тестируете для равенства, идентичны.
  2. Как только вы узнали, что вы не знаете, что проблема в модели формата. Возможно, вы не знаете, что это называется моделью формата, но вы используете ее в TO_CHAR(), поэтому вы направляетесь к документации по этому вопросу.
  3. Документация TO_CHAR() приводит к форматированию моделей, где вы можете найти модификаторы модели модели.
Смежные вопросы