sysdate 的 to_date 函数问题

Posted

技术标签:

【中文标题】sysdate 的 to_date 函数问题【英文标题】:issue with to_date function with sysdate 【发布时间】:2013-01-01 07:52:14 【问题描述】:

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

执行 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  

为什么会这样?

【问题讨论】:

仔细阅读其他问题的答案,您会发现 sysdate 已经是一个日期。不要使用 to_date(sysdate, ...) - 只需使用 sysdate ... to_date function with sysdate的可能重复 【参考方案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;

第二个 to_date,因为 yyyy 是完整的千年格式,所以转到 '01-JAN-0013',即公元 13 日,可能是星期天 :)

【讨论】:

是的..你是对的,谢谢..根据我的程序最好使用 ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';这应该是我在程序中提到的相同参数。 (为了将全年作为 YYYY 或 RRRR )例如:2013 insted of 0013.【参考方案2】:

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

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

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

所以解决办法就是去掉不必要的转换,直接写:

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

【讨论】:

以上是关于sysdate 的 to_date 函数问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle 怎样把systimestamp 转换成date? 如:2012-11-11 17:20:39

Oracle中获取系统时间前一天的函数为sysdate - interval '1' day

sysdate+1/1440 在oracle job 中是啥语法

mybaties 和 oracle的to_date函数的问题

oracle中to_date详细用法示例(oracle日期格式转换)

oracle中to_date详细用法示例(oracle日期格式转换)