将HH:MM:SS转换

4
我正在处理一份电话报告,但遇到了问题。我需要计算代理花费在电话上的时间,源数据以HH:MM:SS形式给出,例如1小时12分10秒,而不是以秒为单位。因此,如果两个代理人接听了2个电话,那么当天花费的时间将加总。
是否可以将其转换为秒?或者有更好的建议吗?

你已经有代码了吗?还是需要从头开始创建? - Dhaval Marthak
2
你能确认时间列的数据类型吗? - Chris Moutray
一个例子会很有帮助。 - NetStarter
1
这是SQLServer吗?(日期/时间操作函数因关系型数据库管理系统而异。) - user359040
你的源数据在数据库中是否为 varchar 类型? - Ozan Deniz
显示剩余4条评论
3个回答

8

将时间转换为秒

如果假设这是一个时间数据类型,那么可以像这样转换为秒

DATEDIFF(second, 0, @YourTimeValue)

以下是一个简单的聚合示例(即求和)

DECLARE @data TABLE (TimeColumn TIME)
INSERT INTO @data values ('01:12:10'), ('02:15:45')

SELECT SUM(DATEDIFF(SECOND, 0, TimeColumn)) FROM @data

这会导致12475秒

秒转时间

我猜为了完整的画面,需要从秒转回时间格式。

SELECT CAST(DATEADD(SECOND, @TotalSecondsValue, 0) AS TIME)

作为聚合示例的一部分,或者作为聚合示例的一部分。
DECLARE @data TABLE (TimeColumn TIME)
INSERT INTO @data VALUES ('01:12:10'), ('02:15:45')

SELECT CAST(DATEADD(SECOND, SUM(DATEDIFF(SECOND, 0, TimeColumn)), 0) AS TIME) FROM @data

这导致时间为03:27:55。

给出了错误的结果...似乎截断了秒数(而不是四舍五入)...例如'00:12:10.750'被转换为730秒(当它应该是731或730.750)。 - Eric Kramer
@EricKramer 我已经很多年没有考虑过这个问题了 - 但我记得使用过这个函数,也许你需要用到DATEDIFF毫秒级的精度;即 DATEDIFF(millisecond, 0, @YourTimeValue) - Chris Moutray
@EricKramer请阅读OP的问题;他说时间是HH:MM:SS,没有提到毫秒。他的例子是1小时12分钟10秒,而不是1小时12分钟10秒750毫秒。因此,您对这个特定问题的评论和负评是不正确的。 - Chris Moutray

4
如果列类型是 datetime,则:
(DATEPART(hh, @yourValue) * 60 * 60) + (DATEPART(mi, @yourValue) * 60) + DATEPART(s, @yourValue)

日期时间部分参考


“h”似乎不是“datepart”方法的有效参数 - @Gavlaaa,这对您有用吗? - Chris Moutray
@ChrisMoutray 是的,打错了。有效值是“hh”或“hour”。不过我更喜欢你的变体。 - Artur Udod
2
我可能有偏见,但我的更优雅 :) - Chris Moutray
如果时间包括小数秒,则会给出不正确的结果... 最好在DATEPART(毫秒,@yourValue)/1000.0的术语中包括。 - Eric Kramer
@EricKramer请阅读OP的问题;他说数据是HH:MM:SS,没有提到毫秒。以最友好的方式,我认为您不应该因为答案与您的问题不符而对其进行投票。 - Chris Moutray

-1

两种方法...

第一种方法很简洁,在没有分数秒参与的情况下表现良好(在 DATEDIFF 中会被截断而不是四舍五入):

select DATEDIFF(second, 0, '00:12:10')

这种第二种方法提取了时间的各个组成部分(包括小数毫秒):

select
      DATEPART(hh, '00:12:10.750')*60*60) + 
      DATEPART(mi, '00:12:10.750')*60 + 
      DATEPART(s, '00:12:10.750') + 
      DATEPART(millisecond, '00:12:10.750')/1000.0

如果您的时间精度比毫秒更细,则可以选择使用纳秒分辨率:
select
      DATEPART(hh, '00:12:10.750')*60*60) + 
      DATEPART(mi, '00:12:10.750')*60 + 
      DATEPART(s, '00:12:10.750') + 
      DATEPART(nanosecond, '00:12:10.750')/1000000000.0

你为什么要重新发布与Artur和我相同的答案,并更改它以适应你的问题?我猜想这是一个四舍五入的问题。 - Chris Moutray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接