使用sql查询汇总时间列

时间:2013-05-30 11:06:58

标签: sql database sql-server-2008

我有一张表如下

repID   ClockIn     ClockOut    TotalHours
109145  7:50:50 AM  3:37:16 PM  7:46:26
109145  7:52:41 AM  3:44:51 PM  7:52:10
109145  8:42:40 AM  3:46:29 PM  7:3:49
109145  7:50:52 AM  3:42:59 PM  7:52:7
109145  8:09:23 AM  3:36:55 PM  7:27:32

此处获取“TotalHours”列作为ClockIn和ClockOut的差异

现在我需要添加“TotalHours”列中的所有数据(varchar)中的数据类型。

我应该如何添加此列.....

我试过

select SUM(TotalHours)

但它返回错误:

  

操作数数据类型varchar对sum运算符

无效

我也尝试将其投放到floatdatetimetime ......

但是所有回报错误......

请帮助总结时间栏....

5 个答案:

答案 0 :(得分:4)

SQL Fiddle

MS SQL Server 2008架构设置

CREATE TABLE Table2
    ([repID] int, [ClockIn] datetime, [ClockOut] datetime, [TotalHours] varchar(7))
;

INSERT INTO Table2
    ([repID], [ClockIn], [ClockOut], [TotalHours])
VALUES
    (109145, '7:50:50 AM', '3:37:16 PM', '7:46:26'),
    (109145, '7:52:41 AM', '3:44:51 PM', '7:52:10'),
    (109145, '8:42:40 AM', '3:46:29 PM', '7:3:49'),
    (109145, '7:50:52 AM', '3:42:59 PM', '7:52:7'),
    (109145, '8:09:23 AM', '3:36:55 PM', '7:27:32')
;

查询1

SELECT convert(varchar(8), dateadd(second, SUM(DATEDIFF(SECOND, ClockIn, ClockOut)), 0),  108)
from Table2
group by repID

<强> Results

| COLUMN_0 |
------------
| 14:02:04 |

查询2

select sum(datediff(second,ClockIn,ClockOut))/3600 as hours_worked
from Table2

<强> Results

| hours_worked|
------------
|       38 |

查询3

select sum(datediff(minute, 0, TotalHours)) / 60.0 as hours_worked
from Table2

<强> Results

| HOURS_WORKED |
----------------
|           38 |

这里最后一个查询取自FreeLancers的答案,因为我很想知道它是否有效。

在这里,首先您需要将日期时间差异转换为秒或分钟,然后将该时间转换回小时。

希望这有帮助。

答案 1 :(得分:3)

由于TotalHours是varchar,我们需要先将它转换为时间。请尝试以下代码

select sum(datediff(minute,'0:00:00',CONVERT(time,TotalHours)))/60.0 as TotalHoursWorked

获得HH输出的一种方法是:MM是 -

select left(right(convert(varchar(20),cast(sum(datediff(minute,'0:00:00',CONVERT(datetime,TotalHours)))/86400.0 as datetime)),8),6)

答案 2 :(得分:1)

尝试以下:

select sum(datediff(minute, 0, TotalHours)) / 60.0 as hours_worked

答案 3 :(得分:0)

尝试:

select sum(datediff(s,ClockIn,ClockOut))

- 在几秒钟内得到结果。

答案 4 :(得分:0)

我知道这个问题已经过时了,但我找到了最好的选择。 试试这个:

select  cast(sum(datediff(second,0,dt))/3600 as varchar(12)) + ':' + 
        right('0' + cast(sum(datediff(second,0,dt))/60%60 as varchar(2)),2) +
        ':' + right('0' + cast(sum(datediff(second,0,dt))%60 as varchar(2)),2)
from    TestTable