Sql 使用sysdate的to_date函数出现问题
我看到了这个 所以我对这个问题有一个疑问: 我在下面的查询中得到了相同日期的不同结果Sql 使用sysdate的to_date函数出现问题,sql,oracle,oracle10g,oracle11gr2,Sql,Oracle,Oracle10g,Oracle11gr2,我看到了这个 所以我对这个问题有一个疑问: 我在下面的查询中得到了相同日期的不同结果 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') FRO
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简单测试(sysdate)
EXEC简单_测试(2013年1月1日)
为什么会发生这种情况?SYSDATE已经是一个日期。所以如果你写:
TO_DATE(SYSDATE, 'DD-MON-yy')
您已经在进行两个转换,一个是从日期到字符串的隐式转换,另一个是从字符串到日期的显式转换。隐式格式是一个问题,因为您无法指定日期格式。(而是从会话的当前设置中获取。)
因此,解决方案是消除不必要的转换,只需写:
SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;
我想解释一下为什么会得到不同的结果 看到这个了吗 如前所述,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
是一个完整的千年格式,转到'01-JAN-0013',它是公元13年,可能是星期日:)仔细阅读其他问题的答案,你会发现sysdate已经是一个日期。不要使用to_date(sysdate…)-只需使用sysdate…可能与yes.重复。。你说得对,谢谢。。根据我的过程,最好使用ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY';这应该是我在程序中提到的相同参数。(以全年为YYYY或RRRR)例如:2013年代替0013年。
select to_date(to_char(sysdate), format) from dual;
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;