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函数的问题