[英]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.