Oracle日期格式问题

时间:2010-12-02 18:47:18

标签: oracle datetime date

我在Oracle中有以下奇怪的问题

(请记住,我在SQL方面经验不足,在Oracle中经验较少)。

如果我这样做:

SELECT TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI') FROM dual

我明白了: 2010-12-02 18:39

那里很好。

但是,如果我这样做:

UPDATE favorite_item
SET favorite_item.last_used_date = TO_DATE(sysdate, 'YYYY-MM-DD HH24:MI')
WHERE favorite_item.favorite_item_id = 1

我在我的数据库中得到这个: 10-DEC-02

哪个是'02年12月10日,这是不正确的

如果我这样做以确认:

SELECT TO_CHAR(favorite_item.last_used_date, 'YYYY-MM-DD HH24:MI') AS last_used_date
    FROM favorite_item
    WHERE favorite_item.favorite_item_id = 1   

我明白了: 0002-12-10 00:00

哪个是完全错误的。

我做错了什么?我觉得日期设置无法正常工作。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

请勿在{{1​​}}上使用TO_DATE(); sysdate已经是约会。

sysdate

答案 1 :(得分:4)

问题是在字符串以外的任何内容上使用to_date()函数。

至于为什么会得到错误的结果,当您在某个日期使用to_date时会发生内部转换。由于to_date实际上将输入作为字符串,因此您的日期最初会转换为字符串(根据您的NLS_DATE_FORMAT设置),然后转换回日期。因此不匹配。

SQL> select sysdate from dual;

SYSDATE
---------
02-DEC-10

SQL> select to_date(sysdate,'YYYY-MM-DD') from dual;

TO_DATE(S
---------
10-DEC-02

--- This is because, the above string is actually executed as

SQL> select to_date(
             to_char('02-DEC-10','YYYY-MM-DD') from dual;

TO_DATE('
---------
10-DEC-02


SQL> select to_date(
  2                  /* implicit conversion... dd-mon-yy' is my session's NLS_DATE_FORMAT */
  3                  to_char(sysdate,'dd-mon-yy'),
  4                 'YYYY-MM-DD')
  5       from dual;

TO_DATE(/
---------
10-DEC-02

答案 2 :(得分:1)

sysdate返回一个日期,因此使用to_date(sysdate,...)将其转换为日期是多余的/不必要的。您得到的结果很奇怪,因为日期是由to_date函数使用Oracle默认的“DD-MON-YY”强制转换为字符串,然后使用您提供的格式“YYYY-MM-DD”返回日期。由于格式不匹配,Oracle将年份解释为日期和日期。这工作正常(但同样,多余):

select to_date(sysdate, 'DD-MON-YY') from dual;