2014-09-21 54 views
1

我被要求創建一個查詢來從Informix數據庫中提取近實時報告(我只有選擇訪問權限,我無法創建SP),我覺得我成功很好,直到我意識到日期時間字段存在差異。看起來填充數據庫的程序是硬編碼的,用UTC輸入時間字段(離當地時間5個小時,當時間是2:30時,它在數據庫中輸入一行,表示John Doe 7:30完成任務)。在我的報告,我應該來計算的秒數(作爲int),因爲用戶完成了任務(字段是「completionTime」),我原來只是使用:在不同時區減去日期時間

sysdate - completionTime interval seconds(9) to seconds cast to char then cast to int 

當我意識到這個錯誤的completionTime字段的時區我剛剛減去了一個整數的偏移量(我已經將時間間隔轉換爲一個整數,所以我只調整了18000的答案)。這一切都很好,直到夏令時開始。然後突然當地時間是4小時(14400秒而不是18000)。因爲我只能從數據庫中選擇,我接下來嘗試使用低效的case語句(我的查詢從< 0.5秒到3-5秒只有25行)。根據另一個論壇的建議,我將時間從unix時代更改爲整數秒,然後使用dbinfo('utc_to_datetime')sp將其轉換回正確時區的日期時間。

這種方法適用,但計算看起來可怕的對我說:

cast(cast(cast((sysdate - dbinfo("utc_to_datetime", cast(cast(cast((completionTime - TO_DATE('Friday January 1, 2010 0:00', '%A %B %d, %Y %R')) as interval second(9) to second) as char(10)) as int) +1262304000)) as interval second(9) to second) as char(10)) as int) 

請注意,我計算的時間長度從completiontime至2010年1月1日再加入12個十億秒(去所有回到unix時代對於Informix的時間間隔秒(9)來說太大了,因此我可以將其插入到dbinfo(「utc_to_datetime」)sp中以將其轉換回到日期時間正確的時區,然後從sysdate中減去它。最糟糕的部分(除了六個演員陣容),我所處理的完成時間都在sysdate的24小時內,大部分時間都在10分鐘內,但我增加了120億秒,以便我可以使用唯一的功能發現時區之間的轉換。

我的問題是,這真的是最好的方法嗎?順便說一句,這個工作非常快,我的查詢返回到合理的執行時間(< 0.5秒),我只是看着這個查詢,並認爲有一個更好的方法。

賈裏德

+0

更簡單的方法是,要麼進行使用UTC或使用Unix的時間戳所有的計算(如果閏秒時忽略時間,然後它很容易將一個轉換爲另一個)。如果完成時間以UTC給出,則不需要本地時間來計算自用戶完成任務以來的秒數,因此無需擔心DST和UTC偏移。您應該可以很容易地將當前時間作爲UTC時間或Unix時間戳。 – jfs 2014-09-26 12:31:03

+0

好的,那是我的問題。你說,「你應該能......」,這就是我一直在想的 - 「我應該能......」,但我找不到任何方法來做到這一點。任何方式我可以找到獲得當前時間返回它在當地時區。有沒有辦法從Informix獲取當前UTC時間或unix時間戳?到目前爲止,我一直無法找到這個。 – 2014-10-02 16:28:28

+0

*「有沒有辦法從Informix獲取當前UTC時間或unix時間戳?」* - 看起來像一個很好的問題(如果沒有問題,您可以單獨提問)。 – jfs 2014-10-02 16:32:02

回答

0

的也許不是sysdate可以使用DBINFO('utc_current')

SELECT DBINFO('utc_current') - (completionTime interval seconds(9) to seconds) FROM ...