比较日期db2 / 400与SQL Server

时间:2016-07-26 23:19:55

标签: sql db2 db2-400

我想比较SQL Server的日期/时间(类型为datetime-16)和db2 / 400(类型Z)。

通常我想知道在18:44和18:45之间有60秒

每个人的显示特征略有不同。

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              

如何进行比较,让我在几分钟(或几小时或几天)内有所不同?

2 个答案:

答案 0 :(得分:4)

在DB2 for IBM i上减去两个时间戳的结果称为duration

您可能会发现TIMESTAMPDIFF()有用

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

第二个参数必须是持续时间的字符表示。

编辑正如Clockwork-Muse所指出的,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                                            

答案 1 :(得分: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