sysdate的to_date函数问题

时间:2013-01-01 07:52:15

标签: sql oracle oracle10g oracle11gr2

我看到了question 所以我对这个问题有一个疑问: 我在以下查询中获得的结果与日期不同。

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  

为什么会这样?

2 个答案:

答案 0 :(得分: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,可能是SUNDAY:)

答案 1 :(得分:1)

SYSDATE已经是一个日期。所以,如果你写:

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

你已经进行了两次转换,从日期到字符串是一个隐含的转换,从字符串到日期是一个明确的转换。隐含的是问题,因为您无法指定日期格式。 (相反,它取自会话的当前设置。)

所以解决办法是摆脱不必要的转换,只需写一下:

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