2016-07-26 104 views
1

我想比較SQL Server(類型datetime-16)和db2/400(類型Z)的日期/時間。比較日期db2/400與SQL Server

通常我想知道有60秒18點44和18:45

之間每一個都有稍微不同的顯示特性。

SQL Server 2016-07-26 18:45:00.000 
Db2/400  2016-07-26-18.45.00.000000 

如果我這樣做對我的DB2數據庫:

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    MYDATETIME - '2016-07-26 18:44:00.000' 
FROM @dates      

我得到這個

MYDATETIME     Constant value     Numeric Expression  
2016-07-26-18.45.00.000000 2016-07-26 18:44:00.000     100.000000  

DB2 SQL顯得相當大方接受略有不同的格式。

但是,查詢告訴我,1分鐘差= 100.看起來我有一個基地10比較發生在這裏。

使用DB2時間戳功能,我得到了相同的結果

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    MYDATETIME - timestamp('2016-07-26-18.44.00.000000') 
FROM @dates    

我怎麼能進行比較,這將使我在幾分鐘(或數小時或數天)的區別?

+1

它實際上[給你一個格式化值(https://www.ibm。 com/support/knowledgecenter/SSEPEK_10.0.0/sqlref/src/tpc/db2z_bif_timestampdiff.html):'100.000000'實際上是'1分鐘','00秒','000000小數秒'。請注意,該值是相對的(即「1個月」),因此可能無用。爲什麼你想要差異呢? –

+0

發條 - 我想問一些問題,比如「自上次運行多久以來」,「向我展示最近24小時的交易」,「提取在昨天下午2點運行,告訴我什麼是新的。」。謝謝 –

+0

你幾乎從不想在查詢中使用差異,因爲它會導致數據庫忽略指示。一般來說,您想構建限制並執行範圍查詢。應用層語言比幾乎所有的RDBMS都有更好的獲取持續時間差異的方法,所以在顯示時間只需要數學計算。你如何試圖在兩個數據庫之間進行通信?爲什麼不通過所需的開始/結束值? –

回答

0

我知道這是DB2/400,但在我的經驗的時候運營商的工作方式相同,所以從this article

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    MYDATETIME - timestamp('2016-07-26-18.44.00.000000') SECONDS 
FROM @dates  

因爲我沒有一個DB2實例上,測試這接下來的事情,我會嘗試將是這樣:

SELECT 
    MYDATETIME, 
    '2016-07-26 18:44:00.000', 
    SECOND(MYDATETIME - timestamp('2016-07-26-18.44.00.000000')) 
FROM @dates  
+0

從差異中返回的值基本上是一個格式化的值--OP看到的'100'不是秒數,而是「1分0秒」。那就是如果那些聲明甚至運行的話;我相當懷疑語法錯誤,因爲您需要一個實際的時間/時間戳值來附加運算符。 –

4

減去在DB2上兩個時間戳IBM i的被稱爲一個duration

您可能會發現0的結果有用

select               
    timestampdiff(2            
       , char(timestamp('2016-07-27 08:35:00.000000') 
         - timestamp('2016-07-27 08:34:00.000000') 
        )           
       )             
from sysibm.sysdummy1            

注意的是,第一參數是一個小INT具有以下值

1 Microseconds 
2 Seconds 
4 Minutes 
8 Hours 
16 Days 
32 Weeks 
64 Months 
128 Quarters 
256 Years 

第二個參數必須是一個持續時間的字符表示。

編輯正如指出的發條,繆斯,TIMESTAMPDIFF()最適用於短的持續時間不到一個月。

如果您需要更長的時間值精確計算,使用下面的形式:

(DAYS(t1) - DAYS(t2)) * 86400 + 
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2)) 

樣品

select               
    (DAYS(timestamp('2016-07-27 08:35:00.000000'))    
     - DAYS(timestamp('2015-07-27 08:35:00.000000'))    
    ) * 86400 +             
    (MIDNIGHT_SECONDS(timestamp('2016-07-27 08:35:00.000000')) 
    - MIDNIGHT_SECONDS(timestamp('2015-07-27 08:35:00.000000'))) 
from sysibm.sysdummy1            
+0

由於使用了估計值(以及持續時間),因此'TIMESTAMPDIFF'接近無用,任何間隔超過一個月的東西都是無用的。 –

+0

@ Clockwork-Muse,但是OP只看了60秒。我添加了一個替代方案... – Charles