我的要求是以下列格式传递日期作为参数'2014-07-11T11:22:21.031 + 03:00'。 然后将其转换为带有时间戳的日期格式,然后将其插入表中。 我一直在尝试并收到以下错误: -
SQL> SELECT TO_DATE('2014-07-11 11:22:21.031','YYYY-MM-DD H24:MI:SS.FFF') FROM DUAL;
SELECT TO_DATE('2014-07-11 11:22:21.031','YYYY-MM-DD H24:MI:SS.FFF') FROM DUAL
*
ERROR at line 1:
ORA-01821: date format not recognized
SQL>
SQL> SELECT TO_TIMESTAMP('2014-07-11 11:22:21.031','YYYY-MM-DD H24:MI:SS.FFF') FROM DUAL;
SELECT TO_TIMESTAMP('2014-07-11 11:22:21.031','YYYY-MM-DD H24:MI:SS.FFF') FROM DUAL
*
ERROR at line 1:
ORA-01821: date format not recognized
SQL>
SQL> SELECT TO_CHAR('2014-07-11 11:22:21.031','YYYY-MM-DD H24:MI:SS.FFF') FROM DUAL;
SELECT TO_CHAR('2014-07-11 11:22:21.031','YYYY-MM-DD H24:MI:SS.FFF') FROM DUAL
*
ERROR at line 1:
ORA-01722: invalid number
如果参数日期的格式为'2014_07_11T11:22:21.031_03:00',该怎么办?
答案 0 :(得分:1)
H24
应该是HH24
由于字符串的隐式日期转换,最后SELECT
引发了错误。您需要使用的格式是
YYYY-MM-DD HH24:MI:SSxFF
最终的查询将是
SELECT TO_TIMESTAMP('2014-07-11 11:22:21.031','YYYY-MM-DD HH24:MI:SSxFF') FROM DUAL;
或TO_TIMESTAMP_TZ
准确地为您提供所需内容!
SELECT TO_TIMESTAMP_TZ('2014-07-11 11:22:21.031 +03:00','YYYY-MM-DD HH24:MI:SSxFF TZH:TZM') FROM DUAL;
最后,如果没有ANSI日期或预定义日期,请不要使用TO_CHAR()
,Oracle首先应用隐式日期转换,然后才会执行TO_CHAR()
。那么,对于您的上一次查询' 2014-07-11 11:22:21.031'隐式尝试使用会话NLS_DATE_FORMAT
将其转换为日期,但失败的数字无效。
答案 1 :(得分:1)
要具体回答你的问题,你有两个错误,'H24'和'FFF'。我把它改为'HH24'和'FF':
SQL> SELECT TO_TIMESTAMP('2014-07-11 11:22:21.031','YYYY-MM-DD HH24:MI:SS.FF') FROM DUAL;
TO_TIMESTAMP('2014-07-1111:22:21.031','YYYY-MM-DDHH24:MI:SS.FF')
---------------------------------------------------------------------------
11-JUL-14 11.22.21.031000000 AM
关于你的三次尝试:
to_date
,因为它不能容纳一小部分
第二即可。to_char
?为什么?它用于显示日期或时间戳
使用适当的格式掩码所需的格式。另一个例子:在会话级别设置所需的格式
SQL> ALTER SESSION SET nls_timestamp_tz_format = 'DD-MON-YYYY HH24:MI:SS.FF TZH:TZM';
Session altered.
SQL> SELECT TO_TIMESTAMP('11-SEP-2014 17:01:30.034000','DD-MON-YYYY HH24:MI:SS.FF') FROM DUAL
2 /
TO_TIMESTAMP('11-SEP-201417:01:30.034000','DD-MON-YYYYHH24:MI:SS.FF')
---------------------------------------------------------------------------
11-SEP-14 05.01.30.034000000 PM
SQL>