2016-09-15 125 views
0

我有一个C#程序,它将TimeSpan值记录到SQL Server表的varchar字段中。例如,varchar字段可能具有值“00:12:05.7989790”。如何使用sql从格式化为“HH:MM:SS”的字符串获取秒数

我如何使用SQL代码在SECONDS中获得总值?由于该varchar代表12分5秒,我想要一个将其提取为“725”的SQL语句。

我已经尝试了一些这样的代码:

select 
    Case when IsDate(the_value)=1 then datepart(HOUR, CONVERT(datetime, the_value))*360 else 0 end 
     + Case when IsDate(the_value)=1 then datepart(MINUTE, CONVERT(datetime, the_value))*60 else 0 end 
     + Case when IsDate(the_value)=1 then datepart(SECOND, CONVERT(datetime, the_value))*1 else 0 end 
from mytable 

但抱怨“从字符串转换日期和/或时间时,转换失败。”

任何建议将不胜感激。

+0

为什么要在varchar列中存储时间?你有没有考虑过使用“时间”专栏?或者将开始和结束存储为日期时间(您可以始终获得三角洲)? –

+0

此外,(a)你不需要重复'CASE'表达式三次,并且(b)尝试转换为'time(0)'或'datetime2(0)'而不是'datetime'(你也可以许多小数位适合'datetime')。 –

+0

@AaronBertrand - 如果是时间跨度*,我会争辩说,将它存储在“时间”列中是不合适的。 SQL Server的时间跨度没有一个体面的数据类型,我可能会争论一个已经转化为相关最小时间元素(秒或毫秒)的单个计数的整数类型。 –

回答

0

我会用datediff()和使用显式转换时间:

select datediff(second, '00:00:00', convert(time, the_value)) 

如果单位可以超过23小时,那么你有一个挑战,因为转换将失败。在这种情况下,字符串操作是一个选项:

select (left(the_value, 2) * 60 * 60 + 
     substring(the_value, 3, 2) * 60 + 
     substring(the_value, 5, 2) 
     ) as seconds 

这假定所有的字符串格式都是正确的。您可以通过以下方式进行验证:case

select (case when the_value like '[0-9]0-9]:[0-9[0-9]:[0-9][0-9]%' 
      then (left(the_value, 2) * 60 * 60 + 
        substring(the_value, 3, 2) * 60 + 
        substring(the_value, 5, 2) 
       ) 
     end) as seconds 
相关问题