我在将MM:SS varchar字段转换为HH:MM:SS以获得总秒数时遇到问题。该字段代表电话时长,以长字符串形式出现。
Phone Duration (MM:SS)
5 :53
8 :47
NULL
14 :11
29 :27
5 :26
5 :38
我的目标是将电话持续时间转换为秒。所以5:53将是353秒。我收到转换错误,我认为这是由于分钟数大于24。
我尝试先修剪电话时长字段并将其转换为时间。然后将时间转换为秒。
with cte1 as (
select
employee
,CAST(REPLACE(LTRIM(RTRIM(phone_duration)), ' ', '') as time) as Phone_Duration
from employee_calls
)
select
employee
,(CAST(CONVERT(DATETIME, Phone_Duration) AS FLOAT)*24*60) as Phone_Duration_Sec
from cte1
上面的查询导致转换错误。
“从字符串转换日期和/或时间时转换失败。”我认为问题与分钟数大于24导致该值超出范围有关。关于如何正确转换电话时长字段的任何想法?
答案 0 :(得分:3)
似乎您只需要使用CONVERT
和DATEDIFF
:
DATEDIFF(SECOND,'00:00:00', TRY_CONVERT(time,'00:' + phone_duration))
注意,如果您的值大于NULL
,它将返回'59:59'
,但是,我假设,您没有此类值,因为不在您的示例数据中。
如果您的值确实大于'59:59
,则可以这样做:
SELECT V.phone_duration,
(TRY_CONVERT(int,LEFT(V.phone_duration,CI.I-1)) * 60) + TRY_CONVERT(int,STUFF(V.phone_duration,1,CI.I,''))
FROM (VALUES('5:53'),
('8:47'),
(NULL),
('14:11'),
('29:27'),
('5:26'),
('62:39'),
('5:38'))V(phone_duration)
CROSS APPLY(VALUES(NULLIF(CHARINDEX(':',V.phone_duration),0)))CI(I);