2016-07-26 106 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