0

我有一个包含开始时间和完成时间的表,我想获取此数据的经过时间,我已经根据它进行了查询。但它不能正常工作。

开始时间:2020-09-04 15:21:34.703333 完成时间:2020-09-04 15:28:32:28

经过时间:00:06:57

如果开始和完成时间超过 24 小时

经过时间:1.00:06:57

SELECT 
starttime,
completiontime,
CONCAT (
CASE
  WHEN GETDATBETWEEN(completiontime,starttime) > 0 THEN CONCAT(GETDAYBETWEEN(COMPLETIONTIME, STARTTIME),'.') 
  WHEN GETDATBETWEEN(completiontime,starttime) < 0 THEN ''
ELSE ''
END
CASE
  WHEN SUBTRACT(GETHOUR(completiontime), GETHOUR(starttime)) > 0 THEN CONCAT(SUBTRACT(GETHOUR(completiontime), GETHOUR(starttime)),':') 
  WHEN SUBTRACT(GETHOUR(completiontime), GETHOUR(starttime)) < 0 THEN CONCAT(SUBTRACT(GETHOUR(completiontime), GETHOUR(starttime)) + 24,':') 
ELSE '0:'
END
CASE
  WHEN SUBTRACT(GETMINUTE(completiontime), GETMINUTE(starttime)) > 0 THEN CONCAT(SUBTRACT(GETMINUTE(completiontime), GETMINUTE(starttime)),':') 
  WHEN SUBTRACT(GETMINUTE(completiontime), GETMINUTE(starttime)) < 0 THEN CONCAT(SUBTRACT(GETMINUTE(completiontime), GETMINUTE(starttime)) + 60,':') 
ELSE '0:'
END
CASE
  WHEN SUBTRACT(GETSECOND(completiontime), GETSECOND(starttime)) > 0 THEN CONCAT(SUBTRACT(GETSECOND(completiontime), GETSECOND(starttime)),':') 
  WHEN SUBTRACT(GETSECOND(completiontime), GETSECOND(starttime)) < 0 THEN CONCAT(SUBTRACT(GETSECOND(completiontime), GETSECOND(starttime)) + 60,':') 
ELSE '0'
END ) AS elapsed_time
FROM sample;

谢谢

4

1 回答 1

0

您需要首先将两个时间戳值之间的时间差作为“原始”时间值。
在 Denodo 中,我相信您可以将这两个值转换为毫秒,并得到如下差异:

GETTIMEINMILLIS(Completiontime) - GETTIMEINMILLIS(Starttime)

然后,您需要在下面的 SQL 语句中看到 @ms 的任何地方替换此“代码”(即 "CASE WHEN @ms >=..." becomes "CASE WHEN GETTIMEINMILLIS(Completiontime) - GETTIMEINMILLIS(Starttime) >=..."等。

SELECT CONCAT(
       CASE WHEN @ms >= 86400000 THEN CONCAT( @ms / 86400000, '.') ELSE '' END,                -- Days
       RIGHT('0' + CAST((@ms % 86400000) / 3600000 AS VARCHAR(2)), 2), ':',                    -- Hours        
       RIGHT('0' + CAST(((@ms % 86400000) % 3600000) / 60000 AS VARCHAR(2)), 2), ':',          -- Minutes
       RIGHT('0' + CAST((((@ms % 86400000) % 3600000) % 60000) / 1000 AS VARCHAR(2)), 2), '.', -- Seconds
       (((@ms % 86400000) % 3600000) % 60000) % 1000,                                          -- Milliseconds
        '') AS "Elapsed Time"   

如果您不需要毫秒,只需删除该行。86400000、3600000、60000 和 1000 值当然分别代表一天、一小时、一分钟和一秒的毫秒数。您需要这些来获取您需要显示的已用时间的每个组成部分的商和余数。我使用您的示例数据来测试 SQL Server 中的结果,如下所示,结果经过时间显示,但我猜您需要使用 Denodo 的 GETTIMEINMILLIS 代替 DATEDIFF_BIG。我知道它肯定不漂亮。把它变成用户定义的函数会更好!

在此处输入图像描述

根据您对 Denodo 没有 RIGHT 功能(尴尬!)的评论,我已经修改了上面的代码以使用 REGEXP(我理解 Denodo 确实有!)作为替代方案。

SELECT CONCAT(
       CASE WHEN @ms >= 86400000 THEN CONCAT( @ms / 86400000, '.') ELSE '' END,                         -- Days
       REGEXP(CAST((@ms % 86400000) / 3600000 AS VARCHAR(2)), '^(\d)$', '0$1'), ':',                    -- Hours        
       REGEXP(CAST(((@ms % 86400000) % 3600000) / 60000 AS VARCHAR(2)), '^(\d)$', '0$1'), ':',          -- Minutes
       REGEXP(CAST((((@ms % 86400000) % 3600000) % 60000) / 1000 AS VARCHAR(2)), '^(\d)$', '0$1'), '.', -- Seconds
       (((@ms % 86400000) % 3600000) % 60000) % 1000,                                                   -- Milliseconds
        '') AS "Elapsed Time"
于 2020-09-05T09:18:09.827 回答