如何使用SQL Server确定某人每天每小时工作的分钟数?

时间:2015-01-30 00:48:24

标签: sql sql-server

我有一个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

2 个答案:

答案 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