我有一个Timeclock
表,其中包含[employeeid]
,[clock in]
和[clock out]
列。
我需要弄清楚他们每个小时工作了多少分钟,例如:
Clockin: 11:30
Clockout: 12:37
我需要知道你有:
11 hour: 30 min
12 hour: 37 min
表格结构:
|empid(int)|clockin(time(7))|clockout(time(7))|
| 103| 11:37:00| 12:37:00|
这是我失败的尝试:
select
hourlist.hour, employeelabor.empposid,
case
when employeelabor.clockin < hourlist.hour
and employeelabor.clockout >= dateadd(HH,1,hourlist.hour)
then '1:00:00.0'
when employeelabor.clockin >= hourlist.hour
and employeelabor.clockout < dateadd(HH,1,hourlist.hour)
then datediff(mi, employeelabor.clockout, employeelabor.clockin)
when employeelabor.clockin >= hourlist.hour
and employeelabor.clockout > dateadd(HH,1,hourlist.hour)
then datediff(mi, 1, dateadd(mi, hourlist.hour, 1))
when employeelabor.clockin < hourlist.hour
and employeelabor.clockout < dateadd(HH,1,hourlist.hour)
then datediff(mi, hourlist.hour, employeelabor.clockout)
else 0
end minworked
from
hourlist
JOIN
dbo.EmployeeLabor ON (employeelabor.clockin >= hourlist.hour
and employeelabor.clockin < dateadd(HH, 1, hourlist.hour)
or (employeelabor.clockout >= hourlist.hour
and employeelabor.clockout < dateadd(HH, 1, hourlist.hour)
order by
hourlist.Hour
答案 0 :(得分:1)
对于这些要求,有一个帮助表是有帮助的。在这种情况下,我们将创建一个小@hours
帮助程序表,将其加载24小时,并将其加入Timeclock
表,以便为每个员工小时返回一条记录:
-- load test data
create table Timeclock(empid int,clockin time,clockout time)
insert into Timeclock values(103,'10:30','12:45')
-- load @hours helper table
declare @hours table (start_time time, end_time time)
declare @hour time = '00:00'
while (select count(*) from @hours) < 24
begin
insert into @hours values(@hour, dateadd(hour,1,@hour))
set @hour = dateadd(hour,1,@hour)
end
-- get minutes worked per hour per empid
select
empid,
datepart(hour,h.start_time) as [hour],
datediff(minute,
case
when t.clockin > h.start_time
then t.clockin
else h.start_time
end,
case
when isnull(t.clockout,getdate()) < h.end_time
then isnull(t.clockout,getdate())
else h.end_time
end) as [minutes_worked]
from Timeclock t
inner join @hours h
on t.clockin < h.end_time
and isnull(t.clockout,getdate()) >= h.start_time
结果:
empid hour minutes_worked
----------- ----------- --------------
103 10 30
103 11 60
103 12 45
SqlFiddle演示:http://sqlfiddle.com/#!6/b92fe/1
答案 1 :(得分:0)
我们可以尝试那样吗
declare @tb table
(
empid int,
clockin time(2),
clockout time(2)
)
Insert into @tb (empid, clockin, clockout) VALUES (1, DATEADD(mi, 2, GETDATE()), DATEADD(mi, 20, GETDATE()))
Insert into @tb (empid, clockin, clockout) VALUES (1, DATEADD(mi, -400, GETDATE()), DATEADD(mi, 25, GETDATE()))
Insert into @tb (empid, clockin, clockout) VALUES (1, '11:37:00', '12:37:00')
SELECT *, DATEDIFF(mi, clockin, clockout), CONVERT(varchar(5), DATEADD(minute, DATEDIFF(mi, clockin, clockout), 0), 114) FROM @tb