sql-server - 使用 SQL Server 2008 R2 将 HH :MM:SS. MS 转换为秒

标签 sql-server sql-server-2008 t-sql datetime

我有一个数据库,其中时间存储为 NVARCHAR(14)。当我查询特定用户的时间时,我看到的示例是 00:08:45.68。

我想要做的是将0小时8分45秒68毫秒的值转换为526秒的值。大于或等于 50 毫秒则向上舍入。

我还存储了未捕获毫秒的值,例如98:40:12。有许多记录存储的时间超过 24 小时,有带毫秒 (97:18:59.32) 的记录,也有不带毫秒 (98:40:12) 的记录。

我看到很多将秒转换为 HH:MM:SS.MS 的查询,但没有其他方式。我还看到许多包含日期的查询,但我没有与时间一起存储的日期。

希望我说得清楚。

我尝试了以下方法:

(DATEPART(hh, trntime.time1) * 60 * 60) + (DATEPART(MI, trntime.time1) * 60) + DATEPART(s, trntime.time1) AS 'Calc_time1_Secs' 

但我收到以下错误消息:

Msg 241, Level 16, State 1, Line 4
Conversion failed when converting date and/or time from character string.

最佳答案

任何大于 24 的小时值对于 TIME 类型来说都不能真正使用。由于除了第一个字段之外的所有字段都是固定长度,您可以:

;with T(f) as (select '97:18:59.32')

select 
    (LEFT(f, CHARINDEX(':', f) - 1)  * 60 * 60)
    + (SUBSTRING(f, CHARINDEX(':', f) + 1, 2) * 60)
    + SUBSTRING(f, CHARINDEX(':', f) + 4, 2)
    + CASE WHEN (SUBSTRING(f, CHARINDEX(':', f) + 7, LEN(f)) >= 50) 
             THEN 1 ELSE 0 END
from T

或者

select 
    (LEFT(f, CHARINDEX(':', f) - 1)  * 60 * 60) 
    + CAST(ROUND(DATEDIFF(MILLISECOND, 0, '00' 
    + (SUBSTRING(f, CHARINDEX(':', f), LEN(f)))) / 1000.0, 0) AS INT)
from T

关于sql-server - 使用 SQL Server 2008 R2 将 HH :MM:SS. MS 转换为秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27234159/

相关文章:

sql - 如何假设 DATETIME 位于我的本地时区,然后转换为 UTC

SQL更新触发器无法处理多个条目

sql - <> 和 != 之间的区别

sql-server - 未关闭的连接 - 连接池调试 SQL Server

c# - 有人请澄清一下 CLR 触发器是否支持 .Net 4.0?

java - Tomcat、Java 和 SQL Server 2008 R2 : Cannot create JDBC driver of class '' for connect URL 'null'

sql - 如何保护 SQL Server 存储过程

sql - SQL Server连接表和数据透视

sql-server - 执行带有参数的存储过程

c# - MSSQL超时错误