查询以计算超过 24 小时间隔的时间总和

时间:2020-12-28 06:11:17

标签: sql sql-server

我有 25:00:00、10:00:00、30:00:00 这样的时间,我想计算数据库中值的总和。我如何才能做到当前用于计算总和的查询是

SQL 查询:

SELECT 
    CAST(FORMAT((SUM((DATEPART("ss", Total_Time) + 
           DATEPART("mi", Total_Time) * 60 + 
           DATEPART("hh", Total_Time) * 3600)) / 3600), '00') AS varchar(max)) + ':' + CAST(FORMAT((SUM((DATEPART("ss", Total_Time) + DATEPART("mi", Total_Time) * 60 + DATEPART("hh", Total_Time) * 3600)) % 3600 / 60), '00') as varchar(max)) + ':' +CAST(FORMAT((SUM((DATEPART("ss", Total_Time) + DATEPART("mi", Total_Time) * 60 + DATEPART("hh", Total_Time) * 3600)) % 3600 % 60), '00') as varchar(max)) as WorkingTimeSum 
FROM 
    tasker_usr.TaskTime

但我收到一个错误

<块引用>

无法将日期时间转换为字符串

3 个答案:

答案 0 :(得分:0)

您无法将值放入 time 数据类型。它只存储小于 23:59:59.9999999 的值。因此您不能直接使用 DATEPARTDATEDIFF。一种方法是拆分您的值(作为秒)并求和。类似的东西

WITH CTE_SUM
AS (
    SELECT SUM(LEFT(column_name, 2) * 3600 
               + SUBSTRING(column_name, 4, 2) * 60 
               + SUBSTRING(column_name, 7, 2)) AS SUM_AS_SECONDS
    FROM YOUR_TABLE
    )
SELECT CAST(SUM_AS_SECONDS / 3600 AS VARCHAR) + ':' 
       + CAST(SUM_AS_SECONDS % 3600 / 60 AS VARCHAR) + ':' 
       + CAST(((SUM_AS_SECONDS % 3600) % 60) AS VARCHAR) AS WorkingTimeSum
FROM CTE_SUM

请注意,这将适用于 99:99:99。如果您的时间值超过此值,则必须根据 : 而不是 {{1} 中的硬编码值进行拆分}}

答案 1 :(得分:0)

你看起来像这样吗?

Declare @Hours Table(Hrs VARCHAR(20))
Declare @Hour TINYINT, @Minute INT,@Second INT, @InSeconds BIGINT, @Cdate DATETIME

INSERT @Hours
SELECT '25:00:00' Union All
SELECT '10:00:00' Union All
SELECT '30:00:00'

select @Hour = sum(cast(Left(Hrs,CharIndex(':',Hrs,1)-1) as int)) from @Hours

select @Minute = sum(cast(Substring(Hrs,CharIndex(':',Hrs,1)+1,2)as int)) from @Hours

select @Second = sum(cast(Substring(Hrs,CharIndex(':',Hrs,1)+4,2)as int)) from @Hours

Set @InSeconds = @Second + (@Minute * 60) + (@Hour *60 *60)

Set @Cdate = dateadd(second,@InSeconds,0)

select datediff(day,'1900-01-01',@Cdate) [Day(s)],
Format(@Cdate,'hh') [Hour(s)],
Format(@Cdate,'mm') [Minute(s)],
Format(@Cdate,'ss') [Second(s)]
<头>
小时 分钟
2 05 00 00

答案 2 :(得分:0)

假设您的格式是 HH(n):MM:SS(即小时可以有 1 位或更多位),您可以分解该值并重建它。这需要字符串函数。您可以获得总秒数:

select sum(left(total_time, charindex(':', total_time) - 1) * 60 * 60 +
           left(right(total_time, 5), 2) * 60 +
           right(total_time, 2)
          ) as total_secs
from tasker_usr.TaskTime;

注意:这会从字符串值隐式转换为整数,但如果您的值一致,那应该没问题。

您可以转换回字符串:

select concat(format(total_secs / (60 * 60), '00:'), 
              format( (total_secs / 60) % 60, '00:'),
              format(total_secs % 60, '00')
             ) as time_format
from (select sum(left(total_time, charindex(':', total_time) - 1) * 60 * 60 +
                 left(right(total_time, 5), 2) * 60 +
                 right(total_time, 2)
                ) as total_secs
     from tasker_usr.TaskTime
    ) t