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

时间:2011-02-09 12:34:28

标签: oracle plsql puzzle

虽然以下代码打印'周四错误',(10-FEB是星期四)

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-FEB是星期三)

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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

提示:

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

返回9,但length('Thursday')为8。

更多信息可在http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/sql_elements004.htm#i34510的Oracle文档中找到: 字符元素MONTH,MON,DAY和DY 用尾随空白填充到最长的完整月份名称的宽度,最长的缩写月份名称,最长的完整日期名称,或者最长的缩写日期名称,分别由NLS_DATE_LANGUAGE和NLS_CALENDAR参数的值确定的有效名称。例如,当NLS_DATE_LANGUAGE为AMERICAN且NLS_CALENDAR为GREGORIAN(默认值)时,MONTH的最大元素为SEPTEMBER,因此MONTH格式元素的所有值都填充为九个显示字符。 NLS_DATE_LANGUAGE和NLS_CALENDAR参数的值在TO_CHAR和TO_ * datetime函数的第三个参数中指定,或者从当前会话的NLS环境中检索。

强调我的。

答案 2 :(得分:0)

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

一周的所有日期都是9。