【问题标题】:Convert HHH:MM:SS to seconds将 HH:MM:SS 转换为秒
【发布时间】:2018-07-11 19:34:21
【问题描述】:

从源数据库中,我得到 HH:MM:SS 为 832:24:12

目前我正在使用以下语句,该语句在大多数情况下都可以正常工作 hh:mm:ss 但当小时数超过 99 时它会失败

ISNULL(LEFT(COLUMN,2) * 3600  + RIGHT(LEFT(COLUMN,5),2) * 60 + RIGHT(COLUMN, 2) ,0)

【问题讨论】:

  • [Column] 是 varchar,通常为 23:34:12(即 HH:MM:SS),但在某些情况下超过小时数,为 832:24:12
  • 它不为空,但在 HH:MM:SS 中,小时值 > 24 所以我无法使用上述语句或任何日期函数。
  • 我刚刚使用下面的语句不知道是否正确 (SUBSTRING(COLUMN,0,(CHARINDEX(':',COLUMN,0)))*3600)+(LEFT(RIGHT (COLUMN,5),2)*60)+RIGHT(COLUMN,2)
  • 所以您的列值为832:24:12,您的预期输出是什么? (什么数据类型?)
  • 在上述情况下,832 是小时,24 是分钟,12 是秒。输出应该是整数 832*3600+ 24*60+12

标签: sql-server tsql datetime sql-server-2012


【解决方案1】:

只是另一个选项,对您的原始版本稍作调整

示例

Declare @V varchar(50) = '832:24:12'

Select (left(@V,charindex(':',@V)-1)*3600) + (left(right(@V,5),2)*60) + right(@v,2)

退货

2996652

【讨论】:

    【解决方案2】:

    您可以使用 PARSENAME() 函数使用一个棘手的解决方案。

    DECALRE @Hours INT = 0, @Minutes INT = 0 , @Seconds INT = 0
    
    SELECT @Hours =  PARSENAME(REPLACE('832:24:12'+':00', ':', '.'),4),
           @Minutes = PARSENAME(REPLACE('832:24:12'+':00', ':', '.'),3),
           @Seconds = PARSENAME(REPLACE('832:24:12'+':00', ':', '.'),2)
    
    SELECT @Hours * 3600  + @Minutes * 60 + @Seconds as TotalSeconds
    

    我将 ':' 替换为 '.'为 PARSENAME() 函数添加虚拟字符序列 ':00' 后的字符,以便通过拆分为分隔数据来工作。

    表查询

    SELECT   PARSENAME(REPLACE(ISNULL(ColumnName + ':00',0), ':', '.'),4) * 3600 +
             PARSENAME(REPLACE(ISNULL(ColumnName + ':00',0), ':', '.'),3) * 60 +
             PARSENAME(REPLACE(ISNULL(ColumnName + ':00',0), ':', '.'),2) As TotalSecs
    FROM TableName
    

    【讨论】:

      【解决方案3】:

      不过,这只是猜测......

      CREATE TABLE #Test (TimeString varchar(10))
      INSERT INTO #Test
      VALUES ('832:24:12')
      
      SELECT TimeString,
             (LEFT(TimeString, H.CI - 1) * 3600) + (SUBSTRING(TimeString,H.CI +1, M.CI - H.CI -1) * 60) + (RIGHT(TimeString, LEN(TimeString) - M.CI))
      FROM #Test T
           CROSS APPLY (VALUES(CHARINDEX(':',TimeString))) H(CI)
           CROSS APPLY (VALUES(CHARINDEX(':',TimeString, H.CI+1))) M(CI);
      
      DROP TABLE #Test;
      

      【讨论】:

        【解决方案4】:

        小时可以是左侧字符减去 6 个位置,以考虑字符串 (:##:##) 中分钟和秒的位置。 可以通过取最右边 5 个字符中的左边 2 个来访问分钟。 秒是正确的 2 个字符。

        例如:

        DECLARE @tempval varchar(100) = '832:24:12'
        
        SELECT LEFT(@tempval, LEN(@tempval) - 6) * 3600
              +LEFT(RIGHT(@tempval, 5), 2) * 60
              +RIGHT(@tempval, 2)
        

        返回

        2996652
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-30
          • 2021-02-18
          • 1970-01-01
          • 1970-01-01
          • 2021-05-09
          • 1970-01-01
          相关资源
          最近更新 更多