2017-06-29 35 views
0

我在我的数据集中有一个名为Duration的列,用于计算事件发生的时间长度。当前格式是在奇数nvarchar(2000)格式产生细胞是这样的:nvarchar时间的SQL格式化时间长度

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

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

怎么会这样被格式化为几秒钟的总数?

一些想法是使用CHARINDEX或一个子字符串,但我不能得到它的工作。

感谢您的帮助!

编辑:我使用的是SQL Server Management Studio中17

+2

其SQL数据库? – maSTAShuFu

+0

我正在使用SQL Server Management Studio 17 – Brady

+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

+0

对于某些测试用例,您的查询失败,[请参阅此处](http://rextester.com/VIKK25965)。 –

+0

你是什么意思蒂姆?我知道这是不是最佳 – maSTAShuFu

+0

只需修复演示,你应该没问题。 –