【问题标题】:SQL Server: convert varchar into time with invalid records(seconds written as 60)SQL Server:将 varchar 转换为具有无效记录的时间(秒写为 60)
【发布时间】:2016-02-08 04:26:43
【问题描述】:

我在我的 SQL Server 数据库中以varchar 的形式存储了时间记录,我正在尝试将其转换为时间。

例如数据存储为12490811

我使用的语法是:

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

但是存储了一些无效记录,其中秒数超过 59,例如 11356000,这不允许我将 varchar 转换为时间。我想知道我们是否可以在看到写为 59 的秒数时使用 Case 语句或类似 '00' 的秒数,否则使用相同的值。我相信语法应该是这样的(我不确定在 'then' 语句中写什么):

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'

请帮我解决这个问题?或者,如果有任何其他方法可以解决这个问题,因为我无法排除这些记录。

提前致谢!

【问题讨论】:

  • 字符串的格式是什么?

标签: sql sql-server-2008 time type-conversion seconds


【解决方案1】:

只使用算术怎么样? 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),但它允许双重转换。)

【讨论】:

  • 数据保存为 15133207(varchar),我想转换为 (time)15:13:32 并丢弃最后两位数。我正在使用语法:cast(convert(time, stuff(stuff(stuff(CommentAddedTime, 3, 0, ':'), 6, 0, ':'), 9, 0, '.')) as time(0 )) as 'CommentAddedTime' 但是有一些无效记录,例如:11356000 不能转换为时间,有什么办法可以解决这个问题吗?可能使用 00 秒,结果显示为:11:35:00?
  • @GeetanjaliSachdeva 。 . .我的回答有什么你不明白的地方吗?将字符串解析为小时、分钟和秒,将它们转换为毫秒(或秒,如果您愿意),并构造 time 变量。
  • 我想把nvarchar转换成时间hh:mm:ss,但是存储了无效数据。例如:如果数据(nvarchar)是11356000,结果应该是:11:35:00(不包括毫秒,显示秒为00)怎么办?
  • @GeetanjaliSachdeva 。 . .我建议您再问一个问题,清楚地描述您要如何处理样本数据和期望的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多