SQL:如何从两个不同的列中减去TIME数据类型,并在HH:MM:SS中生成和AS

时间:2017-05-30 21:43:41

标签: sql sql-server

我有一个表(TimeLog)有2列(StartTime,TIME(0),NOT NULL)和(FinishTime,TIME(0),NOT NULL) 我想写一个查询,它将减去(FinishTime - StartTime)AS ElapsedTime并在HH中生成总和:MM:SS

我试过了

SELECT StartTime
      ,FinishTime
      ,REPLACE(CAST(CAST(DATEDIFF(Hour, StartTime, FinishTime )AS VARCHAR (2)) + ':' + CAST(DATEDIFF(MINUTE, StartTime, FinishTime )AS VARCHAR(2)) + ':'
+ Cast(DATEDIFF(Second, StartTime, FinishTime )AS VARCHAR (2)) AS VARCHAR(8)),'*','00') As ElapsedTime
FROM TimeLog
StartTime   FinishTime  ElapsedTime
08:00:00    08:25:00    0:25:00
08:25:00    09:15:00    1:50:00
09:55:00    12:32:00    3:00:00
12:32:00    14:31:00    2:00:00
12:32:00    13:55:00    1:83:00
09:55:00    11:42:00    2:00:00
07:30:00    08:45:00    1:75:00
07:00:00    07:15:00    0:15:00
07:15:00    08:10:00    1:55:00

但这只有在ElapsedTime低于一小时的情况下才有效。如果超过1小时,则结果格式不正确。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

您可以使用datediff()0的日期添加到dateadd()的日期,将convert()的秒添加到time(0)数据类型,如下所示:

select 
    StartTime
  , FinishTime
  , ElapsedTime = convert(time(0),dateadd(second,datediff(second,StartTime,FinishTime),0))
  /* for greater than 24 hours: */
  , ElapsedTime = right('0' + convert(varchar(9),(datediff(second,StartTime,FinishTime) / 3600 )),2) + ':' 
                + right('0' + convert(varchar(2),(datediff(second,StartTime,FinishTime) / 60) % 60 ),2) + ':' 
                + right('0' + convert(varchar(2),(datediff(second,StartTime,FinishTime) % 60 )),2)
from TimeLog

rextester演示:http://rextester.com/KVC7988

返回:

+-----------+------------+-------------+
| StartTime | FinishTime | ElapsedTime |
+-----------+------------+-------------+
| 08:00:00  | 08:25:00   | 00:25:00    |
| 08:25:00  | 09:15:00   | 00:50:00    |
| 09:55:00  | 12:32:00   | 02:37:00    |
| 12:32:00  | 14:31:00   | 01:59:00    |
| 12:32:00  | 13:55:00   | 01:23:00    |
| 09:55:00  | 11:42:00   | 01:47:00    |
| 07:30:00  | 08:45:00   | 01:15:00    |
| 07:00:00  | 07:15:00   | 00:15:00    |
| 07:15:00  | 08:10:00   | 00:55:00    |
+-----------+------------+-------------+

我相信您可能对datediff()的工作方式感到困惑。 datediff(second,StartTime,FinishTime)返回两次之间的秒数,而不是比较每次“秒”位置的数字。