2011-02-09 31 views
2

雖然下面代碼打印「週四錯誤」,(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; 

我一直在試圖弄清楚,但我不能。任何幫助將非常感激。提前致謝。

回答

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 
+0

謝謝。這個解決方案對我來說更加優雅。 – bhaw2 2011-02-09 13:09:46

+0

對於`fmDay`的+1我不知道。 – 2011-02-09 13:12:34

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,日和DY是將尾部空白填充爲由NLS_D的值確定的有效名稱中最長的完整月份名稱,最長縮寫月份名稱,最長全部日期名稱或最長縮短日期名稱的寬度ATE_LANGUAGE和NLS_CALENDAR參數。例如,當NLS_DATE_LANGUAGE是AMERICAN且NLS_CALENDAR是GREGORIAN(缺省值)時,MONTH的最大元素是SEPTEMBER,因此MONTH格式元素的所有值都填充爲9個顯示字符。 NLS_DATE_LANGUAGE和NLS_CALENDAR參數的值在TO_CHAR和TO_ * datetime函數的第三個參數中指定,或者從當前會話的NLS環境中檢索。

重點是我的。

+0

非常感謝鏈接! – bhaw2 2011-02-09 13:09:05

0

另一個提示:嘗試使用一週的裝飾

所有天將長度爲9.