我看到了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;
/
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
为什么会这样?
答案 0 :(得分: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',这是13AD,可能是SUNDAY:)
答案 1 :(得分:1)
SYSDATE已经是一个日期。所以,如果你写:
TO_DATE(SYSDATE, 'DD-MON-yy')
你已经进行了两次转换,从日期到字符串是一个隐含的转换,从字符串到日期是一个明确的转换。隐含的是问题,因为您无法指定日期格式。 (相反,它取自会话的当前设置。)
所以解决办法是摆脱不必要的转换,只需写一下:
SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;