在oracle 9i中转换作为日期参数的字符串与时区格式

时间:2014-09-11 11:21:39

标签: sql oracle oracle-sqldeveloper oracle9i

我的要求是以下列格式传递日期作为参数'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',该怎么办?

2 个答案:

答案 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>