2015-11-06 45 views
0

我有时间记录存储在我的SQL Server数据库中作为varchar,我试图将其转换为时间。SQL Server:将varchar转换为具有无效记录的时间(秒写为60)

例如,数据存储为12490811

我使用的语法:

cast(convert(time, stuff(stuff(stuff(CommentAddedTime, 3, 0, ':'), 6, 0, ':'), 9, 0, '.')) as time(0)) as 'CommentAddedTime' 

但也有存储一些无效的记录,其中秒超过59像11356000这并不让我将varchar转换为时间。我想知道,如果我们可以使用Case语句或者像'00'这样的东西,在看到写入59的秒数时使用秒,否则使用相同的值。我相信语法应该是这样的(我不知道该怎么在“然后”语句写):

select 
    case 
     when substring(stuff(stuff('11356000', 3, 0, ':'), 6, 0, ':'),7,10) > 5900 
      then .... 
      else 
      cast(convert(time, stuff(stuff(stuff(CommentAddedTime, 3, 0, ':'), 6, 0, ':'), 9, 0, '.')) as time(0)) 
    end as 'CommentAddedTime' 

请帮助我什么,我们可以怎样做呢?或者,如果有任何其他方法来解决这个问题,因为我不能排除这些记录。

在此先感谢!

+0

是什么格式的字符串? –

回答

0

如何使用算术? SQL Server会自动将字符串转换为数字。然后,您可以将其转换为一次。对于毫秒计​​算:

select (left(CommentAddedTime, 2) * 60 * 60 * 1000 + 
     substring(CommentAddedTime, 3, 2) * 60 * 1000 + 
     substring(CommentAddedTime, 5, 2) * 1000 + 
     substring(CommentAddedTime, 7, 2) * 10 
     ) 

要将此转换为时间:

select dateadd(ms, 
       (left(CommentAddedTime, 2) * 60 * 60 * 1000 + 
       substring(CommentAddedTime, 3, 2) * 60 * 1000 + 
       substring(CommentAddedTime, 5, 2) * 1000 + 
       substring(CommentAddedTime, 7, 2) * 10 
       ), 
       cast(cast(0 as datetime) as time) 
      ) 

(SQL Server不允许cast(0 as time)但它允许双投。)

+0

数据保存为15133207(varchar),我想将其转换为(时间)15:13:32并丢弃最后两位数字。我使用语法:cast(时间,东西(东西(stuff(CommentAddedTime,3,0,':'),6,0,':'),9,0,'。'))as time(0 ))作为'CommentAddedTime'但有一些无效的记录,如:11356000哪些不转换成时间,有没有什么办法可以解决这个问题?可能会使用00秒并显示结果为:11:35:00? –

+0

@GeetanjaliSachdeva。 。 。我不明白你的回答有什么问题吗?将字符串解析为几小时,几分钟和几秒钟,然后将这些字符串转换为毫秒(如果您愿意的话可以秒),然后构建'time'变量。 –

+0

我想将nvarchar转换为时间hh:mm:ss,但存储的数据无效。例如:如果数据(nvarchar)是11356000,结果应该是:11:35:00(不包括毫秒和显示秒数为00)我们该怎么做? –