我在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
哪个是完全错误的。
我做错了什么?我觉得日期设置无法正常工作。
提前感谢您的帮助。
答案 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;