小编典典

sysdate与to_date函数有关的问题

sql

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

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

为什么会这样?


阅读 190

收藏
2021-05-05

共1个答案

小编典典

我想解释一下为什么您会得到不同的结果。

看到这个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;

由于yyyy是整整千年的格式,因此第二个to_date转到‘01 -JAN-0013’,它是13AD,可能是SUNDAY :)

2021-05-05