繁体   English   中英

如何使用CURSOR / PROC计算SQL中两天之间的工作时间?

[英]How to calculate hours worked between 2 different days in SQL using CURSOR/PROC?

我需要计算员工从2019年1月21日到2019年1月22日的开始工作时间为21:00,22天的超时时间为07:00,应该为10小时,但显示为14小时。

create table babysitter (
babysitterid char(5) not null primary key,
datein date not null,
timein time not null,
dateout date not null,
timeout time not null, 
noofhrswrk int,
amtpaid int
);

insert into babysitter values('BS001', '18-Jan-2019', '10:00', '18-Jan-2019', '16:00', '', '')
insert into babysitter values('BS002', '15-Jan-2019', '13:00', '15-Jan-2019', '20:00', '', '')
insert into babysitter values('BS003', '21-Jan-2019', '21:00', '22-Jan-2019', '07:00', '', '')
insert into babysitter values('BS004', '11-Jan-2019', '08:00', '11-Jan-2019', '13:00', '', '')

declare @timein time
declare @timeout time
declare @hoursworked datetime

declare Calculate_No_Hrs cursor for 
select timein, timeout, noofhrswrk from babysitter

open Calculate_No_Hrs

fetch next from Calculate_No_Hrs into @timein, @timeout, @hoursworked

while (@@FETCH_STATUS = 0)
begin
update babysitter
set noofhrswrk = abs(datediff(hour, timeout, timein)) 

fetch next from Calculate_No_Hrs into @timein, @timeout, @hoursworked
end

close Calculate_No_Hrs
deallocate Calculate_No_Hrs

您需要结合时间和日期值,然后得出差值:

USE Sandbox;
GO

CREATE TABLE babysitter (ID char(5),
                         StartDate date,
                         StartTime time(0),
                         EndDate date,
                         EndTime time(0),
                         BlankCol1 char(1),
                         BlankCol2 char(1));

insert into babysitter values('BS001', '18-Jan-2019', '10:00', '18-Jan-2019', '16:00', '', '')
insert into babysitter values('BS002', '15-Jan-2019', '13:00', '15-Jan-2019', '20:00', '', '')
insert into babysitter values('BS003', '21-Jan-2019', '21:00', '22-Jan-2019', '07:00', '', '')
insert into babysitter values('BS004', '11-Jan-2019', '08:00', '11-Jan-2019', '13:00', '', '')
GO

SELECT DATEDIFF(HOUR,V.StartTime, V.EndTime)
FROM dbo.babysitter
     CROSS APPLY (VALUES (DATEADD(SECOND,DATEDIFF(SECOND,0,StartTime),CONVERT(datetime2(0),StartDate)),
                          DATEADD(SECOND,DATEDIFF(SECOND,0,EndTime),CONVERT(datetime2(0),EndDate)))) V(StartTime, EndTime)


GO
DROP TABLE dbo.babysitter;

尝试一下-在计算日期差之前,它会在组合日期和时间时给出正确的小时数

declare @in datetime, @out datetime

set @in = '21-Jan-2019 21:00' 
set @out = '22-Jan-2019 7:00'

select DATEDIFF(hh, @in, @out)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM