从nvarchar时间长度的SQL格式

时间:2017-06-29 00:25:00

标签: sql sql-server time nvarchar

我的数据集中有一个名为Duration的列,用于计算事件发生的时间长度。当前格式采用奇数nvarchar(2000)格式,生成如下单元格:

7H35M49S (as in 7 hours, 35 minutes, 49 seconds)
32M10S
2H23S

(小时数,分钟数,秒数)

如何将其格式化为总秒数?

有些想法是使用CHARINDEX或子串,但我无法使用它。

感谢您的帮助!

编辑:我正在使用SQL Server Management Studio 17

1 个答案:

答案 0 :(得分:1)

仅解决您的问题以下是我如何剖析您的格式并应用基本算法来获取秒数。

declare @mytime varchar(100) = '7H35M49S'

select
    isnull(NULLIF(left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime)-1)),''),0) -- to get Hours
 ,isnull(NULLIF(replace(left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''),charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))),'M',''),''),0) -- to get M
 ,isnull(nullif(
  left(replace(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), IIF(charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))=0,0,charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))) ),'')
   ,iif(charindex('S',
   replace(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), IIF(charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))=0,0,charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))) ),'')
   ) = 0,0, 
   charindex('S',
   replace(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), IIF(charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))=0,0,charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))) ),'')
   )-1)
   )
  ,'')
  ,0)  -- to get S

在这里演示:

Rextester