我有一个表(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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但这只有在ElapsedTime低于一小时的情况下才有效.如果超过1小时,则结果格式不正确.有人可以帮忙吗?
您可以从加秒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
Run Code Online (Sandbox Code Playgroud)
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 |
+-----------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)
我相信你可能对如何datediff()运作感到困惑.datediff(second,StartTime,FinishTime)返回两次之间的秒数,而不是每次"秒"位置的数字.