Oracle怪异行为字符串与星期几的比较
下面的代码打印的是“错误的星期四”(2月10日是星期四) 以下打印“正确”(2月9日是星期三) 我一直想弄明白,但我做不到。任何帮助都将不胜感激。提前感谢。提示: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
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