SQL:如何从两个不同的列中减去时间数据类型,并生成HH:MM:SS中的总和
我有一个表(TimeLog),它有两列(StartTime,TIME(0),notnull)和(FinishTime,TIME(0),notnull) 我想写一个查询,将减去(FinishTime-StartTime)作为ElapsedTime,并以HH:MM:SS的形式生成总和 我试过了SQL:如何从两个不同的列中减去时间数据类型,并生成HH:MM:SS中的总和,sql,sql-server,Sql,Sql Server,我有一个表(TimeLog),它有两列(StartTime,TIME(0),notnull)和(FinishTime,TIME(0),notnull) 我想写一个查询,将减去(FinishTime-StartTime)作为ElapsedTime,并以HH:MM:SS的形式生成总和 我试过了 SELECT StartTime ,FinishTime ,REPLACE(CAST(CAST(DATEDIFF(Hour, StartTime, FinishTime )AS VAR
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
但这只有在ElapsedTime低于一小时时才有效。如果超过1小时,结果的格式不正确。有人可以帮忙吗?您可以使用
dateadd()
将datediff()
中的秒数添加到0
日期,并将其转换为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演示:
返回:
+-----------+------------+-------------+
| 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(秒、开始时间、完成时间)
返回两次之间的秒数,它不会比较每次“秒”处的数字 您完全正确,您的代码运行完美。@DruidUID很乐意提供帮助!换句话说,(1)得到以秒为单位的差值(2)将差值加到1900-01-01,然后(3)从总和(datetime)中得到时间。明亮的请注意(对于将来的读者),这在超过24小时的时间间隔内不起作用。@SqlZim如何添加以查找多行的总耗时?
+-----------+------------+-------------+
| 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 |
+-----------+------------+-------------+