我有一个表(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小时,则结果格式不正确。有人可以帮忙吗?
答案 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)
返回两次之间的秒数,而不是比较每次“秒”位置的数字。