【问题标题】:How to convert varchar to time hh:mm如何将 varchar 转换为时间 hh:mm
【发布时间】:2019-07-07 22:56:20
【问题描述】:

我有代表军事时代的 varchars:

a 2130 -- 21 hours
b 103 -- 1 hour
c 10  -- 10 minutes
d 1  -- 1 minutes

左边的两个字符总是代表分钟。在示例中,10 和 1 以上的 c 和 c 始终是分钟。示例 b 103 有三个字符。 1 是小时 03 在这种情况下是分钟。

如何将其转换为时间 hh:mm 格式?

【问题讨论】:

  • 喜欢STUFF(RIGHT('0000' + str, 4), 3, 0, ':')?
  • 103如何等于“1小时”?
  • 你的意思是右边的两个字符代表分钟吗?
  • 看看我的答案,它也适用于数据类型 varchar。
  • 您想要一个time 值还是只需要一个具有该格式的字符串? SQL Server 的版本也很重要。

标签: sql-server tsql sql-server-2008-r2 type-conversion


【解决方案1】:

一个选项是使用 Format()

示例

Declare @YourTable table (SomeCol int)
Insert into @YourTable values
 (2130)
,(103)
,(10)
,(1)

Select SomeCol
      ,TimeValue = format(SomeCol,'00:00')
 From  @YourTable

退货

SomeCol TimeValue
2130    21:30
103     01:03
10      00:10
1       00:01

编辑 - 2008 年请求编辑

Declare @YourTable table (SomeCol int)
Insert into @YourTable values
 (2130)
,(103)
,(10)
,(1)

Select SomeCol
      ,TimeValue = stuff(right('0000' + left(SomeCol, 4),4), 3, 0, ':')
 From  @YourTable

【讨论】:

  • 这似乎是一个不错的解决方案,但在 SQL Server 2008 R2 中出现错误:“'格式'不是可识别的内置函数名称。”。所以请建议它是否对特定版本的 SQL Server 有效。
  • 指向有关:(1) FORMAT 不会将类型转换为 TIME 作为所请求问题的标题。此外,此查询甚至不会返回 VARCHAR,而是返回 NVARCHAR - 您可以使用 SELECT SQL_VARIANT_PROPERTY (format(SomeCol,'00:00'),'BaseType') FROM @YourTable 确认这一点。这意味着我们不是将时间(0)成本的 3 个字节传递给客户端,而是从服务器传递一个具有 5 个字符的字符串类型 NVARCHAR,即 10 个字节。这是一个巨大的差异,会极大地影响性能。
  • @BrijeshKumarTripathi 请参阅 2008 版的编辑
  • @BrijeshKumarTripathi 乐于助人。告诉您的 DBA,2008 年的扩展支持将于 2019 年 7 月结束
  • 我们的 DBA 团队正在努力升级它。再次感谢您的帮助!
【解决方案2】:

您可以使用列值的长度和 case 语句尝试以下操作。

Declare @YourTable table (SomeCol int)
Insert into @YourTable values
 (2130)
,(103)
,(10)
,(1)

Select 
    case LEN(SomeCol)
        when 4 then SUBSTRING('2130', 1, 2) + ':' + SUBSTRING('2130', 3, 2)
        when 3 then '0' + SUBSTRING('103', 1, 1) + ':' + SUBSTRING('103', 2, 2)
        when 2 then '00:' + CONVERT(Varchar(5), SomeCol)
        else '00:0' + CONVERT(Varchar(5), SomeCol)
    end as TimeValue
from @YourTable

【讨论】:

    【解决方案3】:

    雅各布,早安,

    请检查此解决方案是否适合您:

    Declare @YourTable table (SomeCol int)
    Insert into @YourTable values
     (2130)
    ,(103)
    ,(10)
    ,(1)
    --Select SomeCol,TimeValue = format(SomeCol,'00:00'), SQL_VARIANT_PROPERTY (format(SomeCol,'00:00'),'BaseType')
    --From  @YourTable
    SELECT CONVERT(TIME(0),TIMEFROMPARTS(ROUND(SomeCol/100,0), SomeCol%100,0,0,0))
    FROM @YourTable
    

    Ops,我注意到 cmets 中有新信息。好像您使用 SQL Server 2008R2 和 TIMEFROMPARTS 将无法在 SQL Server2008r2 上运行(仅从 2012 年开始)...我将在一秒钟内编辑答案

    注意!我强烈建议您重新考虑您的数据库设计。请阅读我上面写的评论以获取更多信息

    更新:

    -- For old servers please check if one of these this fit you
    SELECT --RIGHT('00' + CONVERT(VARCHAR(2),ROUND(SomeCol/100,0)),2),RIGHT('00' + CONVERT(VARCHAR(2),SomeCol%100),2),
        CONVERT(TIME(0),RIGHT('00' + CONVERT(VARCHAR(2),ROUND(SomeCol/100,0)),2) + ':' + RIGHT('00' + CONVERT(VARCHAR(2),SomeCol%100),2))
    FROM @YourTable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 2014-10-06
      • 2017-10-22
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多