我有 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
但我收到一个错误
<块引用>无法将日期时间转换为字符串
答案 0 :(得分:0)
您无法将值放入 time
数据类型。它只存储小于 23:59:59.9999999
的值。因此您不能直接使用 DATEPART
或 DATEDIFF
。一种方法是拆分您的值(作为秒)并求和。类似的东西
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