Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如何从两个不同的列中减去时间数据类型,并生成HH:MM:SS中的总和_Sql_Sql Server - Fatal编程技术网

SQL:如何从两个不同的列中减去时间数据类型,并生成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

我有一个表(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 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    |
+-----------+------------+-------------+