0

我想在 HH:MM:SS 中计算 Sum

首先,我正在计算 HH:MM:SS 中的日期时间差异(效果很好)

Select  * 
Into    #_TicketType 
From    (    
        Select  *,
                convert(varchar(5), DateDiff(s, [Start Date] , [End Date] )/3600)
              + ':'
              + convert(varchar(5),DateDiff(s, [Start Date] , [End Date])%3600/60)
              + ':'
              + convert(varchar(5),(DateDiff(s,[Start Date] , [End Date])%60)) as [Ticket Type Time]
            ,
                convert(varchar(5),DateDiff(s, [Ticket Open Time]  , [Ticket Closed Time] )/3600)
              + ':'
              + convert(varchar(5),DateDiff(s,[Ticket Open Time]  , [Ticket Closed Time])%3600/60)
              + ':'
              + convert(varchar(5),(DateDiff(s,[Ticket Open Time]  , [Ticket Closed Time])%60))[Total Call Time]
        FROM CTE
        )_A

[Start Date] , [End Date],[Ticket Open Time] , [Ticket Closed Time]类型的列DateTime

此外,我想在 HH:MM:ss 中计算它的总和

我的查询:-

Select Distinct ATM,
    CAST (
          (SUM (datepart(hh, convert (varchar, [Ticket Type Time], 108)))
        + (sum (datepart(mi, convert (varchar, [Ticket Type Time], 108)))/60) ) 
    AS VARCHAR(2))
    + ':'
    + CAST (
          sum( datepart(mi, convert (varchar, [Ticket Type Time], 108))) 
        - 60 
        * (sum(datepart(mi, convert (varchar, [Ticket Type Time], 108)))/60)
    as VARCHAR(2))
    + ':' 
    + CAST (
          sum( datepart(ss, convert (varchar, [Ticket Type Time], 108))) 
        - 60 
        * (sum( datepart(SS, convert (varchar, [Ticket Type Time], 108)))/60)
    as VARCHAR(2))
From #_TicketType Group By ATM

它给了我错误

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

数据库 SQL 服务器 2008

4

2 回答 2

2

这里有两个相关的问题。

  1. SQL Server 不支持间隔数据类型。
  2. “8 点”和“8 小时”通常写成完全相同——“8:00:00”——但它们的意思完全不同。

您不能添加“日期时间”类型的值。“8点加3点”有意义吗?没有。

现在,“8 小时加 3 小时”是有道理的,但小时不是 DateTime 类型。在标准 SQL 中,它们属于 Interval 类型。在不支持 Interval 数据类型的系统中(SQL Server 就是其中之一),您必须以已知单位(如小时、分钟或秒)计算差异。您可以轻松地总结这些类型的值。

  • 以秒或分钟为单位计算差异。
  • 将这些值保留在您的查询中。
  • 对秒或分钟求和。
  • 将转换为漂亮、友好的显示格式 (HH:MM:SS) 视为一个单独的步骤,或者让前端应用程序代码来完成。

这应该消除对 convert() 的部分或全部调用,甚至可能运行得更快。

于 2013-04-12T15:22:43.620 回答
2

我认为您的意思是转换为时间(如果您的 SQL Server 版本不支持,则转换为日期时间),而不是 varchar。

但是,这是一种非常糟糕的方法。25:01:01 将不是有效的日期时间。您应该总结秒数(如另一个答案中所建议的那样),然后在最后按您喜欢的方式格式化结果。

因此,在您的第一个查询中,包括以秒为单位的持续时间的另一列:

, DateDiff(s,[Start Date] , [End Date]) as [Ticket Type Seconds]

然后在第二个查询中,只需格式化 SUM([Ticket Type Seconds]),可能像这样:

STR(SUM([Ticket Type Seconds])/3600) 
+ RIGHT(CONVERT(char(8),DATEADD(s,SUM([Ticket Type Seconds]),0),108),6)

这为您提供了小时数(可能超过 24),与您在将秒数转换为约会时间。

于 2013-04-12T16:28:54.823 回答