db2 中时间戳在时间格式(如 hh:mm:ss)中的差异



下面是在精细的mysql数据库中工作的查询。 mysql>从Request_Master_Table中选择REQ_NO,Req_CloseDate,Req_WorkStartDate,TIMEDIFF(Req_CloseDate,Req_WorkStartDate(持续时间,其中REQ_NO='10348'; +--------+---------------------+---------------------+----------+ |REQ_NO |Req_CloseDate |Req_WorkStartDate |持续时间 | +--------+---------------------+---------------------+----------+ | 10348 |2017-02-03 05:36:14 |2017-02-01 05:55:29 |47:40:45 | +--------+---------------------+---------------------+----------+

但是我无法在 db2 中获取什么查询以获得相同的输出?

一种解决方案是使用DAYS()函数

select  REQ_NO
,       Req_CloseDate
,       Req_WorkStartDate
,       DAYS(Req_CloseDate) - DAYS(Req_WorkStartDate) AS Duration 
from
Request_Master_Table
where
REQ_NO ='10348'

如果您需要覆盖超过 24 小时,您可能需要自己将秒差转换为小时、分钟和秒。 例如,像这样的东西(你当然可以把它放在一个名为TIMEDIFF的用户定义函数中(

select REQ_NO
,       Req_CloseDate
,       Req_WorkStartDate
,                  HOURS_BETWEEN  (Req_CloseDate, Req_WorkStartDate)      || ':'
|| TRIM(TO_CHAR(ABS(MOD(MINUTES_BETWEEN(Req_CloseDate, Req_WorkStartDate),60)),'00')) || ':'
|| TRIM(TO_CHAR(ABS(MOD(SECONDS_BETWEEN(Req_CloseDate, Req_WorkStartDate),60)),'00'))
from
Request_Master_Table
where
REQ_NO ='10348'

或者,如果您使用的是 Db2 V11.1 或更高版本,只需使用DAYS_BETWEEN()

select REQ_NO
,       Req_CloseDate
,       Req_WorkStartDate
,       DAYS_BETWEEN(Req_CloseDate, Req_WorkStartDate) AS Duration
from
Request_Master_Table
where
REQ_NO ='10348'

仅供参考,Db2 V11.1还引入了SECONDS_BETWEEN()MINUTES_BETWEEN()HOURS_BETWEEN()WEEKS_BETWEEN()YEARS_BETWEEN()以及其他新的内置功能,增加了功能并与其他关系数据库管理系统兼容。 https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.wn.doc/doc/c0054107.html

如果时间值之间的差异小于 24 小时,则会以TIME数据类型的形式返回差异。

select REQ_NO
,       Req_CloseDate
,       Req_WorkStartDate
,       TIME('00.00.00') + ABS(SECONDS_BETWEEN(Req_CloseDate, Req_WorkStartDate)) SECONDS AS Duration
from
Request_Master_Table
where
REQ_NO ='10348'

如果差异可以超过 24 小时,请使用这样的东西(然后你可以把它放在 UDF 中......

select REQ_NO
,       Req_CloseDate
,       Req_WorkStartDate
,                               HOURS_BETWEEN  (Req_CloseDate, Req_WorkStartDate)      || ':'
|| TRIM(TO_CHAR(ABS(MOD(MINUTES_BETWEEN(Req_CloseDate, Req_WorkStartDate),60)),'00')) || ':'
|| TRIM(TO_CHAR(ABS(MOD(SECONDS_BETWEEN(Req_CloseDate, Req_WorkStartDate),60)),'00'))
from
Request_Master_Table
where
REQ_NO ='10348'

您可以使用 TIMESTAMPDIFF 函数来获取两个时间戳之间的近似差值。

使用此链接了解如何使用EXTRACT(( 和JULIAN_DAY((函数获得准确的结果。

使用 TIMESTAMPDIFF :

注意:-TIMESTAMPDIFF((函数进行了以下假设

  • 一年有365天
  • 一年有 52 周
  • 一个月有 30 天

TIMESTAMPDIFF((的语法:-

timestampdiff (n, char( 
timestamp('2018-05-10')- 
timestamp('2002-04-10')))

代替n,使用以下值之一来指示结果的时间单位:

  • 1 = 秒的小数部分
  • 2 = 秒
  • 4 = 分钟
  • 8 = 小时
  • 16 = 天
  • 32 = 周
  • 64 = 月
  • 128 = 季度
  • 256 = 年

假设您想要以天为单位的差异,则修改后的查询将是

select REQ_NO,
Req_CloseDate,
Req_WorkStartDate,
TIMESTAMPDIFF(16,Req_CloseDate,Req_WorkStartDate) Duration 
from Request_Master_Table where REQ_NO ='10348'; 

对于 HH:MM:SS 格式

获取以为单位的差异并添加到时间('00:00:00'(

根据要求修改查询

传递Req_CloseDate&Req_WorkStartDate参数的格式,同时转换为 TIMESTAMP

select REQ_NO,Req_CloseDate,
Req_WorkStartDate,time('00:00:00') + 
TIMESTAMPDIFF(2,TIMESTAMP_FORMAT(Req_CloseDate,'YYYY-MM-DD-HH.MI.SS.NNNNNN'),TIMESTAMP_FORMAT(Req_WorkStartDate,'YYYY-MM-DD-HH.MI.SS.NNNNNN')) SECONDS Duration 
from REQUEST_MASTER_TABLE 
where REQ_NO ='10348';

最新更新