将MM:SS varchar转换为HH:MM:SS,然后转换为秒

时间:2019-08-13 14:41:17

标签: sql sql-server time

我在将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导致该值超出范围有关。关于如何正确转换电话时长字段的任何想法?

1 个答案:

答案 0 :(得分:3)

似乎您只需要使用CONVERTDATEDIFF

DATEDIFF(SECOND,'00:00:00', TRY_CONVERT(time,'00:' + phone_duration))

db<>fiddle

注意,如果您的值大于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);