У меня есть список задач,
для каждого у меня есть TaskID, startTime и StopTime в миллисекундах с 1-1-1970 и список пользователей (#Tasks).
Мне нужно рассчитать время, затраченное каждым пользователем на задачу, разделенное на дневное / ночное время, неделю или выходные, обычное / сверхурочное время с учетом ночных часов с 22:00 до 06:00.
Конечно, есть лучшее решение, но пока я получил это:
IF OBJECT_ID('tempdb..#Tasks') IS NULL
BEGIN
create table #Tasks
(
TaskID nvarchar(50),
DateStart bigint,
DateStop bigint,
Staff nvarchar(100)
)
insert into #Tasks values
('C001',1554181200000,1554190200000,'john,jack'),
('C002',1554202800000,1554212700000,'tom,john'),
('C003',1554228000000,1554246900000,'john,franck'),
('C004',1554613200000,1554626700000,'john')
END
GO
declare
@UserName nvarchar(50)='john',
@DateFrom datetime='2019-04-01',
@DateTo datetime='2019-04-30',
@nStart time='06:00:00',
@nStop time='22:00:00'
select
startday as [Day],
sum([WeekDay]) as [WeekDay],
sum([WeekNight]) as [WeekNight],
sum([WeekendDay]) as [WeekendDay],
sum([WeekendNight]) as [WeekendNight],
sum([TotalMinutes]) as [TotalMinutes],
0 WeekDayOverTime,
0 WeekNightOvertime,
0 WeekendDayOvertime,
0 WeekendNightOvertime,
[UserName]
,timeframe
from
(
select
iif(isWeekend=1,NightMinutes,0) WeekendNight,
iif(isWeekend=0,NightMinutes,0) WeekNight,
iif(isWeekend=1,DayMinutes,0) WeekendDay,
iif(isWeekend=0,DayMinutes,0) [WeekDay],
TotalMinutes,
username,
startday,
timeframe
from
(
select
iif(Before6>0,Before6,0)+ iif(After22>0,After22,0) NightMinutes,
TotalMinutes-iif(Before6>0,Before6,0)- iif(After22>0,After22,0) DayMinutes,
TotalMinutes,
startday,
isWeekend,
UserName,
timeframe
from
(
Select
(t.datestop-t.datestart)/60000 TotalMinutes,
datediff(n,convert(time,DATEADD(SECOND,t.DateStart/1000,'1970-01-01')),@nStart) Before6,
datediff(n,@nStop,convert(time,DATEADD(SECOND,t.DateStop/1000,'1970-01-01'))) After22,
iif((((DATEPART(DW, convert(datetime,DATEADD(SECOND,t.DateStart/1000,'1970-01-01'))) - 1 ) + @@DATEFIRST ) % 7) IN (0,6),1,0) isWeekend,
convert(varchar(10),DATEADD(SECOND,t.DateStart/1000,'1970-01-01'),126) startday,
STUFF(( SELECT distinct ' ' + convert(varchar(5),DATEADD(SECOND,t.DateStart/1000,'1970-01-01'),108)+'-'+convert(varchar(5),DATEADD(SECOND,t.DateStop/1000,'1970-01-01'),108) AS [text()]
FROM #Tasks tt
--WHERE tt.taskID=t.TaskID
FOR XML PATH('') ), 1, 1, '' ) AS [timeframe],
@UserName UserName
FROM #Tasks t
WHERE t.Staff like '%'+@UserName+'%'
and DATEADD(SECOND,t.DateStart/1000,'1970-01-01') between @DateFrom and @DateTo
) z
) zz
) zzz
group by startday,username,timeframe
order by startday
Мне нужно сейчас:
1) группируйте результаты по дням, суммируя WeekDay, WeekNight, WeekendDay, WeekendNight и TotalMinutes, и объединяя таймфрейм, например, 2 апреля "05: 00-07: 30 | 11: 00-13: 45 | 18: 00 -23: 00"
2) Не суммируйте время между 12:00 и 12:30 (если применимо), так как это обеденное время
3) учитывая, что после 8 часов в день это должно быть рассчитано как сверхурочное время, я должен разделить общее количество минут между временем и сверхурочным временем, но в зависимости от того, сверхурочное время приходится на дневное или ночное время или на выходные
4) в конечном итоге использовать праздничный стол
другими словами, мы должны иметь это:
Day TotalMinutes WeekDay WeekNight WeekendDay WeekendNight WeekDayOverTime WeekNightOvertime WeekendDayOvertime WeekendNightOvertime UserName timeframe
02/04/2019 630 420 60 0 0 45 75 0 0 john 05:00-07:30|11:00-13:45|18:00-23:00
07/04/2019 225 0 0 165 60 0 0 0 0 john 05:00-08:45
потому что (2 апреля) у нас есть:
Первое задание:
60 минут обычного ночного времени
90 минут обычного дневного времени
Второе задание:
165 минут обычного дневного времени, но из-за времени обеда приходится только 135
Третье задание:
240 DayTime
75 NightTime
но поскольку с заданиями 1 и 2 мы суммируем 285 минут, только первые 185 минут третьего задания являются обычным дневным временем: оставшиеся 45 являются сверхурочным дневным временем, а следующие 75 ночного времени на самом деле являются овертаймом ночного времени