Суммарное значение за период - PullRequest
0 голосов
/ 19 октября 2019

Я хочу, чтобы сумма рабочего времени машины сохранялась в таблице, но мне нужна сумма за периодическое время, например, между 2019.07.10 и 2018.04.05 каждые 7 дней.

Ответы [ 3 ]

1 голос
/ 19 октября 2019

процедура создания spCalculateWorkingHours объявляет @DaysGap tinyint как начало объявляет @MinWorkingDate объявляет дату @MaxWorkingDate объявляет дату @weekStratDay объявляет дату @WeekEndDay дата

create table #temp
(WeekStartDay date,
 WeekEndDay date,
 WorkingHours int)

select @minWorkingdate = min(workingdate) from yourtable
select @MaxWorkingDate = Max(workingdate) from yourtable
set @daysGap=7
set @weekStratDay=@MinWorkingDate

while (@weekStratDay<@MaxWorkingDate)
    begin
        set @WeekEndDay dateadd(day,@DaysGap,@weekStratDay)

        insert into #temp
        select @minWorkingdate,@WeekEndDay,sum(hours) from yourtable where workingdate between @minWorkingdate and @WeekEndDay
        group by @minWorkingdate,@WeekEndDay

        set @weekStratDay=dateadd(day,1,@WeekEndDay)
    end

select * from #temp

end

1 голос
/ 19 октября 2019

С рекурсивным CTE, который возвращает все 7-дневные интервалы между указанными днями:

declare @mindate date = '2018-04-05';
declare @maxdate date = '2019-07-10';
with cte as (
  select 
    @mindate startdate, 
    dateadd(day, 6, @mindate) enddate 
  union all 
  select 
    dateadd(day, 1, enddate),  
    case 
      when dateadd(day, 6, enddate) > @maxdate then @maxdate
      else dateadd(day, 6, enddate)
    end  
  from cte 
  where cte.enddate < @maxdate
)
select c.startdate, c.enddate, sum(hours) totalhours 
from cte c left join tablename t
on t.date between c.startdate and c.enddate
group by c.startdate, c.enddate

См. Упрощенную демонстрацию . Результаты:

> startdate  | enddate    | totalhours
> :----------| :--------- | ---------:
> 05/04/2018 | 11/04/2018 |         14
> ....................................
> 16/08/2018 | 21/08/2018 |         11
> ....................................
> 28/08/2018 | 02/09/2018 |          1
> ....................................
0 голосов
/ 19 октября 2019

Я бы просто вычел меньшее значение и разделил бы разницу на 7. Примерно так:

select min(datecol), sum(worktime)
from t
group by datediff(day, '2018-04-05', <datecol>) / 7
order by min(datecol);

Если у вас есть данные на каждый день, это должно быть именно то, что вам нужно.

...