Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用sysdate的to_date函数出现问题_Sql_Oracle_Oracle10g_Oracle11gr2 - Fatal编程技术网

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;