SQL Server中的总小时数

时间:2018-08-05 08:02:44

标签: sql sql-server

在我的数据库中,我有一个表,该表的列类型为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

任何想法都会受到赞赏。

3 个答案:

答案 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在子查询中获取hoursminutes

然后使用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不是存储时间信息的好选择,请查看datetimedatetimetimestamp,{{ 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之间的区别(请参见查询中的区别)。