2014-09-11 47 views
1

我的要求是以以下格式傳遞日期作爲參數'2014-07-11T11:22:21.031 + 03:00'。 然後將其轉換爲帶時間戳的日期格式,然後將其插入表中。 我一直在努力並得到以下錯誤: -在oracle中使用時區格式作爲參數的字符串轉換9i

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

要求的格式'H24'應該是'HH24'最後'SELECT'拋出錯誤,由於您的字符串的隱式日期轉換。 。 – 2014-09-11 11:29:21

+0

有兩個錯誤,'H24'和'FFF'。它應該是'HH24'和'FF' – 2014-09-11 11:39:38

回答

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()對於甲骨文第一才把TO_CHAR()將執行適用隱日期轉換。因此,對於您最後一次使用會話NLS_DATE_FORMAT的查詢「2014-07-11 11:22:21.031」已被隱式嘗試轉換爲日期,並且因無效號碼而失敗。

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> 
相關問題