db2中时间戳与时间格式之间的差异,如hh:mm:ss

时间:2018-05-10 02:47:13

标签: mysql db2

以下是在精细的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中获取db2中的查询以获得相同的输出?

2 个答案:

答案 0 :(得分:0)

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

使用此link了解如何使用 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格式

获取 SECONDS 的差异,并添加到时间('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';

答案 1 :(得分:0)

一种解决方案是使用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'

FYI 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'