我有一张表如下
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
,datetime
和time
......
但是所有回报错误......
请帮助总结时间栏....
答案 0 :(得分:4)
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