在我的数据库中,我有一个表,该表的列类型为Float
,代表总工作时间。我必须在所有行上求和。
我不能使用求和函数,因为08.03 = 08小时03分钟。
例如:
00.55 + 00.51=> 01.06
但我想要
00.55 + 00.51 => 01.46
我的查询
Declare @TEMP1 table (TotalHours float)
insert into @TEMP1(TotalHours)
select ol.HrWork TotalHours
from OTLog ol
where EmployeeId = 2048
Declare @attCount int
Declare @attSum int
set @attSum = 0;
set @attCount = (select count(*) from @TEMP1)
print @attCount
while (@attCount <> 0)
begin
set @attSum = @attSum + (select Top 1 (LEFT(TotalHours,1)*60)+(RIGHT(TotalHours,2)) TotalHours from @TEMP1);
delete top(1) from @TEMP1;
set @attCount = @attCount - 1;
print @attSum;
end
print @attSum
select *
from OTLog
where EmployeeId = 2048
任何想法都会受到赞赏。
答案 0 :(得分:2)
应使用正确的数据类型存储时间,而不要浮动
您需要将浮动时间分为小时和分钟。 sum()并将其转换回浮动格式
select convert(int, total_minute / 60) + (total_minute % 60) / 100.0
from
(
select total_minute = sum(convert(int ,([hour] * 60) + [minute]))
from
(
select hour = floor(TotalHours), minute = convert(int, TotalHours * 100) % 100
from @TEMP1
) d
) d
答案 1 :(得分:1)
您可以尝试使用left(col1,2)
获取小时数,right(col1,2)
获取分钟数。
然后使用SUM
在子查询中获取hours
和minutes
。
然后使用DATEADD
添加时间值。
CREATE TABLE T(
col1 VARCHAR(10)
);
INSERT INTO T VALUES ('00.55');
INSERT INTO T VALUES ('00.51');
查询1 :
select FORMAT(DATEADD(minute,m,0)+ DATEADD(hour,h,0),'HH:mm:ss')
from (
SELECT SUM(CAST(left(col1,2) AS INT)) h ,SUM(CAST(right(col1,2) AS INT)) m
FROM T
) t1
Results :
| |
|----------|
| 01:46:00 |
答案 2 :(得分:1)
您遇到的问题很少:
首先,float
不是存储时间信息的好选择,请查看date
,time
,datetime
,timestamp
,{{ 1}}-选择其中一种,它将防止发生此类问题,此外,您还可以使用SQL中的方法来处理此类数据类型。
秒-datetime2
只是一个近似值!float
存储精确值,您必须意识到这一点,
第三部分-在SQL Server中处理十进制值时需要小心,请参见Precision, scale, and Length (Transact-SQL)和以下线程:Why is 199.96 - 0 = 200 in SQL?
毕竟,我可以建议此查询解决您的问题:
decimal
See this SQL fiddle,在那里您可以测试使用select id,
sum(hours) + floor(sum(minutes) / 60) hours,
sum(minutes) % 60 minutes
from (
select id,
floor([time]) [hours],
cast([time] * 100 as int) % 100 [minutes]
from tblFloat
) a group by id
和float
之间的区别(请参见查询中的区别)。