【问题标题】:Cast varchar to time and SUM in SQL generates Error将 varchar 转换为时间和 SQL 中的 SUM 生成错误
【发布时间】:2015-03-11 06:03:21
【问题描述】:

我尝试以 HH:MM 格式投射时间,它工作正常,但是当我插入超过 23 小时的时间时,即24:0 它会产生错误

“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。”

下面是代码

CREATE TABLE mytable
(
timeduration varchar(25)
)

INSERT INTO mytable VALUES ('05:30')
INSERT INTO mytable values ('24:0')
INSERT INTO mytable values ('04:33')

-- OUTPUT SHOULD BE 34:3 MINUTES

select CAST
(
(SUM (datepart(hh, convert (varchar, timeduration, 108))) +
(sum(datepart(mi, convert (varchar, timeduration, 108)))/60) ) AS VARCHAR(2)
)
+ ':' +
CAST
(
sum(datepart(mi, convert (varchar, timeduration, 108))) - 60 * (sum(datepart(mi, convert (varchar, timeduration, 108)))/60)
 as VARCHAR(2))
 from mytable

【问题讨论】:

  • 我正在使用 sql server
  • SQL Server 中的time 数据类型表示一天中的时间,不是持续时间。因此,它不(不需要)支持大于 24 小时的负数或值。这也是为什么它没有任何对加法的原生支持(因为将一天中的两次加在一起是无稽之谈)。只需在几分钟或几秒钟内工作,并将任何格式转换留给另一种语言/层来完成,并实际支持持续时间/时间跨度数据类型。

标签: sql sql-server-2008 stored-procedures


【解决方案1】:

你的问题是'24:00',如果你想让它工作,这里应该是'00:00'。 但是你必须在查询中添加 case 表达式。我建议你改写为:

DECLARE @mytable TABLE
    (
      timeduration VARCHAR(25)
    )

INSERT  INTO @mytable
VALUES  ( '05:30' )
INSERT  INTO @mytable
VALUES  ( '24:0' )
INSERT  INTO @mytable
VALUES  ( '04:33' );


WITH    cte
          AS ( SELECT   SUM(CAST(SUBSTRING(timeduration, 1, CHARINDEX(':', timeduration) - 1) AS INT)) AS Hours ,
                        SUM(CAST(SUBSTRING(timeduration, CHARINDEX(':', timeduration) + 1, 5) AS INT)) AS Minutes
               FROM     @mytable
             )
    SELECT  CAST(Hours + Minutes / 60 AS NVARCHAR(20)) + ':' + CAST(Minutes % 60 AS NVARCHAR(20)) AS Duration
    FROM    cte

输出:

Duration
34:3

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2019-08-15
    • 2016-02-06
    相关资源
    最近更新 更多