Сравнение странных строк поведения Oracle с днем ​​недели - PullRequest
2 голосов
/ 09 февраля 2011

В то время как приведенный ниже код выводит «Неверный четверг» (10-ФЕВ - четверг)

BEGIN
  IF to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'Day')='Thursday' THEN
    dbms_output.put_line('Correct');

  ELSE
    dbms_output.put_line('Wrong '||to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'Day'));
  END IF;
END;

Следующие распечатки «Правильный» (09-ФЕВ среда)

BEGIN
  IF to_char(to_date('09-FEB-2011','DD-MON-YYYY'),'Day')='Wednesday' THEN
    dbms_output.put_line('Correct');

  ELSE
    dbms_output.put_line('Wrong '||to_char(to_date('09-FEB-2011','DD-MON-YYYY'),'Day'));
  END IF;
END;

Я пытался понять это, но не смог.Любая помощь приветствуется.Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 09 февраля 2011

to_char по умолчанию с пробелами:

SQL> BEGIN
  2    dbms_output.put_line('x' ||
  3                         to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'Day')||
  4                         'x');
  5  END;
  6  /

xThursday x

Используйте модификатор fm для предотвращения заполнения:

SQL> BEGIN
  2    IF to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'fmDay')='Thursday' THEN
  3      dbms_output.put_line('Correct');
  4    ELSE
  5      dbms_output.put_line('Wrong '||to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'fmDay'));
  6    END IF;
  7  END;
  8  /

Correct

PL/SQL procedure successfully completed
3 голосов
/ 09 февраля 2011

Подсказка:

select length(to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'Day')) from dual;

возвращает 9, хотя length('Thursday') равно 8.

Дополнительную информацию можно найти в документации Oracle по адресу http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/sql_elements004.htm#i34510: Элементы символовМЕСЯЦ, МЕСЯЦ, ДЕНЬ и DY дополняются дополненными пробелами по ширине самого длинного полного названия месяца, самого длинного сокращенного названия месяца, самого длинного полного имени даты или самого длинного сокращенного названия дня соответственно,среди допустимых имен, определяемых значениями параметров NLS_DATE_LANGUAGE и NLS_CALENDAR.Например, когда NLS_DATE_LANGUAGE - AMERICAN, а NLS_CALENDAR - GREGORIAN (по умолчанию), самый большой элемент для MONTH - SEPTEMBER, поэтому все значения элемента формата MONTH дополняются девятью отображаемыми символами.Значения параметров NLS_DATE_LANGUAGE и NLS_CALENDAR указываются в третьем аргументе для функций даты и времени TO_CHAR и TO_ *, либо они извлекаются из среды NLS текущего сеанса.

Упор сделан.

0 голосов
/ 09 февраля 2011

Еще один совет: попробуйте использовать обрезку

Все дни недели будут продолжительностью 9.

...