4

我有一张如下表

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 运算符无效

我还尝试将其转换为float,datetimetime...

但所有返回错误...

请帮忙总结一下时间栏......

4

5 回答 5

4

SQL小提琴

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

结果

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

查询 2

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

结果

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

查询 3

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

结果

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

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

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

希望这可以帮助。

于 2013-05-30T11:31:58.863 回答
3

由于 TotalHours 是 varchar ,我们需要先将其转换为 time 。试试下面的代码

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)
于 2013-05-30T11:41:14.350 回答
1

尝试以下:

select sum(datediff(minute, 0, TotalHours)) / 60.0 as hours_worked
于 2013-05-30T11:10:00.193 回答
0

尝试:

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

- 在几秒钟内得到结果。

于 2013-05-30T11:19:54.553 回答
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
于 2018-02-16T08:14:42.460 回答