2017-08-23 86 views
0

我收到來自像我們下面的API之一的響應,甲骨文UTC日期字符串插入日期列

'createdate' => 'Sun Jan 31 04:40:15 UTC 2016' 

我使用Oracle數據庫來保存API的數據,我用Perl語言解析API數據。在將上面的日期字段插入到db之前,我在我的Perl中將以下字符串轉換爲日期,並且工作正常。

$res->{'createdate'} = strftime ('%d-%b-%y',localtime(str2time($res->{'createdate'}))); 

我已經嘗試使用像下面的插入查詢(甲骨文)相同,所以我可以刪除perl轉換。它結束了一些錯誤。請幫助我。謝謝。

對於如:

insert 
into device_det (id, createdate) 
values (111111,TO_TIMESTAMP('Wed Aug 16 16:59:31 UTC 2017', 'YYYY-MM-DD')); 

這給瞭如下錯誤。

Error report - 
SQL Error: ORA-01841: (full) year must be between -4713 and +9999, and not be 0 
01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0" 
*Cause: Illegal year entered 
*Action: Input year in the specified range 
+0

「TO_TIMESTAMP」的第二個參數不應該是匹配該數據串的模式嗎? 'YYYY-MM-DD'是你的目標,對吧?根據[文檔](https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions193.htm),目標始終是「TIMESTAMP」類型。但是我從來沒有用過Oracle,我只是在閱讀文檔。 – simbabque

+0

嘗試'TO_TIMESTAMP_TZ('Wed Aug 16 16:59:31 UTC 2017','Dy Mon DD HH24:MI:SS TZR YYYY')' –

回答

2

您的嘗試有兩個問題。首先,在概念上最重要的是,您的輸入字符串表示WITH TIME ZONE的時間戳,而不是通用的時間戳。無論您將如何將其添加到數據庫,此數據需要什麼數據類型?你需要將它轉換爲「本地」時區,然後簡單地丟棄時區信息? (也可以考慮使用TIMESTAMP WITH LOCAL TIME ZONE數據類型 - 如果您不熟悉該文檔,請執行Google搜索以查找文檔。)在任何實際實施之前,您需要作出此決定 - 或者您的業務必須作出此決定。或者,也可以將數據保存在TIMESTAMP WITH TIME ZONE數據類型中(以UTC作爲時區)。

第二,正如您在問題的評論中已經提到的那樣,格式模型與您的輸入字符串的實際結構不匹配。您的格式模型以'YYYY'開頭,所以輸入字符串應該有年份。但它不;它有'Wed '。顯然,即使你解決了第一個問題,也不會起作用。但回答第一個問題確實是重點;修復格式模型要容易得多。