我看到了这个问题, 所以我对此问题有一个疑问:在以下查询中,在相同日期我得到的结果是不同的。
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
请帮助我,在此先谢谢。
编辑
我写了一个简单的过程,通过它可以找到下面给出的日期:
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
为什么会这样?
我想解释一下为什么您会得到不同的结果。
看到这个sqlfiddle
就像已经说过的那样,sysdate被视为DATE类型,并且您在进行隐式转换时
DATE
select to_date(sysdate, format) from dual;
因为to_date的第一个参数应该是varchar类型,所以系统会执行以下操作:
select to_date(to_char(sysdate), format) from dual;
因为您的隐式日期格式为'DD-MON-YY',所以查询进入:
'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;
由于yyyy是整整千年的格式,因此第二个to_date转到‘01 -JAN-0013’,它是13AD,可能是SUNDAY :)
yyyy