2015-10-17 292 views
0

我有4件用戶輸入:startDate,endDate,startTime,endTimeAS400/DB2 - 將基於整數的日期和時間轉換爲時間戳?

數據庫中的日期和時間設置與以前使用的任何設置都不同。日期是自1900年12月31日以來的天數。所以是一個整數。例如,2015年10月16日,將表示爲41927.

時間以ISO格式 - 沒有小數,所以也是一個整數。所以08:00:00將是80000. 19:00:00將是190000.它基本上是hhmmss - 但有時你只有一個h。

我想將日期和時間過濾成範圍。在第一天,我只是隨便看看,有時能正常工作:

SELECT * FROM database WHERE day = 41927 AND time > startTime and time < endTime 

它也可以,如果你嚴格望着天:

SELECT * FROM database WHERE day > startDate AND day < endDate 

問題是當你需要找到兩次日期之間的項目有兩次,因爲它會在每天兩次之間過濾掉任何不在這兩次之間的內容。我知道有一種方法可以創建一個時間戳,但我努力將它們放在查詢中使用兩個整數。

我有什麼樣的選擇來解決這個問題?

回答

2

你可以用簡單的算術使用:

select date('1900-12-31') + col days 

不過,我懷疑真正的日期開始日期是1899年12月31日。這是Excel使用的日期(第1天是1900-01-01)。

編輯:

糟糕,遺漏了秒。一種方法是:

select timestamp(date('1900-12-31') + coldays days) + 
     (floor(coltime/10000) * 60*60 + 
     mod(floor(coltime/100)) * 60 
     mod(coltime, 100) 
     ) seconds 
+0

好,很好,解決了日子,唯一的問題是秒。它們實際上並不是在幾秒鐘內 - 它們是沒有小數的ISO格式。所以07:00是25200秒,但是我的格式是'70000'。我想最好的辦法是把它分成相應的數字並進行一些乘法運算。而且,無論出於何種原因,起源時間實際上是1900-12-31,我不知道爲什麼它是以這種方式設置的。 –

+0

到你的編輯:是的,這很好!如果有其他人遇到這種情況,應該是:select timestamp(date('1900-12-31')+ coldays days)+ (floor(coltime/10000)* 60 * 60 + mod (floor(coltime/100),100)* 60 mod(coltime,100) )seconds –

+0

@Kaysays。 。 。我修正了邏輯。謝謝。 –

2

當你有一個工作的答案(來自您的評論)...

select * from mytable 
where CURRENT_TIMESTAMP 
     < timestamp(date('1900-12-31') + coldays days) 
       + (floor(coltime/10000) * 60*60 
       + mod(floor(coltime/100),100) * 60 mod(coltime, 100)) 

你可能會發現它並沒有表現非常好,在上一列函數的用法WHERE子句限制了標準索引的可用性。充其量,你會得到一個完整的索引掃描,更糟糕的是你會得到一個全表掃描。

兩個選項
1)一個最新版本的OS(v6.1及更高版本)可以創建派生索引。

create index mytsidx on mytable 
    (timestamp(date('1900-12-31') + coldays days) 
      + (floor(coltime/10000) * 60*60 
      + mod(floor(coltime/100),100) * 60 mod(coltime, 100))  
       seconds) 

2)在舊版本中,你會希望你的到來時間戳轉換成零件,並比較像這樣:

select * from mytable 
    where (strdays < coldays 
      or strdays = coldays and strtime <= coltime) 
     and (enddays > coldays 
       or enddays = coldays and endtime >= coltime) 

如果使用選項1走,我建議一個創建UDF來處理轉換。

create index mytsidx on mytable (CONVERT_TO_TS(coldays,coltime)); 

    select * from mytable 
    where CONVERT_TO_TS(coldays,coltime) 
       between start_ts and end_ts;