Oracle怪异行为字符串与星期几的比较

Oracle怪异行为字符串与星期几的比较,oracle,plsql,puzzle,Oracle,Plsql,Puzzle,下面的代码打印的是“错误的星期四”(2月10日是星期四) 以下打印“正确”(2月9日是星期三) 我一直想弄明白,但我做不到。任何帮助都将不胜感激。提前感谢。提示: select length(to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'Day')) from dual; 返回9,尽管length('thready')是8 有关更多信息,请访问Oracle的docu,网址为: 字符元素MONTH、MON、DAY和DY分别用尾随空格填充到由NLS_d

下面的代码打印的是“错误的星期四”(2月10日是星期四)

以下打印“正确”(2月9日是星期三)

我一直想弄明白,但我做不到。任何帮助都将不胜感激。提前感谢。

提示:

select length(to_char(to_date('10-FEB-2011','DD-MON-YYYY'),'Day')) from dual;
返回9,尽管
length('thready')
是8

有关更多信息,请访问Oracle的docu,网址为: 字符元素MONTH、MON、DAY和DY分别用尾随空格填充到由NLS_date_LANGUAGE和NLS_CALENDAR参数值确定的有效名称中最长的完整月份名称、最长的缩写月份名称、最长的完整日期名称或最长的缩写日期名称的宽度。例如,当NLS_DATE_LANGUAGE为AMERICAN且NLS_CALENDAR为GREGORIAN(默认值)时,月份的最大元素为九月,因此月份格式元素的所有值都填充为九个显示字符。NLS_DATE_LANGUAGE和NLS_CALENDAR参数的值在to_CHAR和to_*datetime函数的第三个参数中指定,或者从当前会话的NLS环境中检索

Emphasis mine.

默认情况下为空格填充:

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
使用修改器防止填充:

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

另一个提示:尝试使用修剪


一周中的所有工作日长度均为9天

非常感谢。这就解释了!。谢谢这个解决方案在我看来更优雅。
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
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