2

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

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;
    /

执行 simple_test(sysdate);

anonymous block completed
the day of given date is sunday  

执行 simple_test('01-JAN-2013');

anonymous block completed
the day of given date is tuesday  

为什么会这样?

4

2 回答 2

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',它是公元 13 年,可能是星期天 :)

于 2013-01-01T09:26:09.710 回答
1

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

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

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

所以解决方案是摆脱不必要的转换,只需编写:

SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;
于 2013-01-01T09:00:45.010 回答