2013-01-01 56 views
2

我看到這個question 所以我對這個問題有一個疑問: 我在下面的查詢中得到了不同的結果。與sysdate的to_date函數問題

SELECT TO_CHAR(to_date(sysdate, 'DD-MON-yy'), 'DAY'), 
    TO_CHAR(to_date(sysdate, 'DD-MON-yyyy'), 'DAY'), 
    TO_CHAR(to_date(sysdate, 'DD-MON-rr'), 'DAY'), 
    TO_CHAR(to_date(sysdate, 'DD-MON-rrrr'), 'DAY') 
FROM dual; 

輸出逐列:提前

TUESDAY SUNDAY TUESDAY TUESDAY 

請幫幫我,謝謝。

EDIT

我寫傳遞日期用於找到天下面給出一個簡單的程序:

SET serveroutput ON; 
CREATE OR REPLACE 
    PROCEDURE simple_test 
     (
     date_in   IN VARCHAR2) 
         IS 
     v_date DATE  := to_date(date_in,'dd-mon-yyyy'); 
     v_day VARCHAR2(10):=TO_CHAR(v_date,'day'); 
    BEGIN 
     dbms_output.put_line('the day of given date is '||v_day); 
    END; 
    /

EXEC simple_test(SYSDATE);

anonymous block completed 
the day of given date is sunday 

EXEC simple_test('01 -JAN-2013');

anonymous block completed 
the day of given date is tuesday 

爲什麼會發生這種情況?

+3

仔細閱讀回答其他問題你會看到sysdate已經是一個日期。不要使用to_date(sysdate,...) - 只是使用sysdate ... –

+0

[to \ _date函數與sysdate]的可能重複(http://stackoverflow.com/questions/14108022/to-date-function- with-sysdate) –

回答

4

我想解釋一下爲什麼你得到不同的結果。

看到這個sqlfiddle

正如它已經表示,SYSDATE被視爲DATE類型和你正在做的隱式轉換時

select to_date(sysdate, format) from dual; 

因爲TO_DATE的第一個參數是VARCHAR類型的系統做:

select to_date(to_char(sysdate), format) from dual; 

因爲您的隱式日期格式爲'DD-MON-YY',您的查詢進入:

SELECT TO_CHAR(to_date('01-JAN-13', 'DD-MON-yy'), 'DAY'), 
    TO_CHAR(to_date('01-JAN-13', 'DD-MON-yyyy'), 'DAY'), 
    TO_CHAR(to_date('01-JAN-13', 'DD-MON-rr'), 'DAY'), 
    TO_CHAR(to_date('01-JAN-13', 'DD-MON-rrrr'), 'DAY') 
FROM dual; 

第二TO_DATE,因爲yyyy是一個充滿成千上萬年的格式,進入01 -JAN-0013' ,這是13AD,可能是星期天:)

+0

是啊..你是對的,謝謝..根據我的過程最好使用ALTER SESSION SET NLS_DATE_FORMAT ='DD-MON-YYYY'; 這應該是我在程序中提到的相同參數。 (按照YYYY或RRRR計算全年)例如:2013年全年0013。 – ajmalmhd04

1

SYSDATE已經是日期。所以,如果你寫:

TO_DATE(SYSDATE, 'DD-MON-yy') 

你已經做兩次轉換,一個內隱一個從日期字符串,並從字符串到日期的明確的一個。隱含的一個是問題,因爲您無法指定日期格式。 (相反,它是從會話的當前設置拍攝。)

因此,解決辦法是擺脫不必要的轉換的只是寫的:

SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;