比较日期 db2/400 与 SQL 服务器

Compare dates db2/400 vs SQL Server

我想比较来自 SQL 服务器(类型 datetime-16)的 date/time 与 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              

我怎样才能进行比较,让我在几分钟(或几小时或几天)内有所不同?

我知道这是 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    

在 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                                            

注意第一个参数是一个small int,其值如下

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

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

EDIT 正如 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