首页 > 解决方案 > 将 MM:SS varchar 转换为 HH:MM:SS 然后转换为秒

问题描述

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

标签: sqlsql-servertime

解决方案


似乎您只需要使用CONVERTand DATEDIFF

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

db<>小提琴

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);

推荐阅读