Как рассчитать часы, отработанные между двумя разными днями в SQL, используя CURSOR / PROC? - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно рассчитать количество часов, которые сотрудник проработал с 21 января 2019 года по 22 января 2019 года. Время начала работы 21-го - 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

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Вам нужно будет объединить значения времени и даты, а затем получить разницу:

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;
0 голосов
/ 19 марта 2019

Попробуйте это - это дает правильные часы при объединении даты и времени до расчета разницы в часах

declare @in datetime, @out datetime

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

select DATEDIFF(hh, @in, @out)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...