Нужна помощь по рекурсивному запросу Sql - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно смоделировать дату и время окончания производственного заказа.Пример: производственный заказ занимает 4:55 часов, но у него может быть 1 или 2 перерыва и, возможно, 1 обеденный перерыв зависит от количества часов и текущего времени.Мне нужно рассчитать все время между текущим временем и временем производства.Я просто не знаю, будет ли полезен повторяющийся запрос.

create table [TeamBreak]
(
  Team int ,
  StartBreak datetime,
  EndBreak datetime 
);

insert into [TeamBreak] values
(1, '1900-01-01 09:00', '1900-01-01 09:15'),
(1, '1900-01-01 12:00', '1900-01-01 12:30'),
(1, '1900-01-01 14:15', '1900-01-01 14:30'),
(2, '1900-01-01 18:15', '1900-01-01 18:30'),
(2, '1900-01-01 01:15', '1900-01-01 01:30')

DECLARE @start AS datetime='2019-01-31 7:00'
DECLARE @end AS datetime='2019-01-31 11:50' --prodction end date without break

SELECT SUM(iif(@end BETWEEN t.startbreak AND t.endbreak, DATEDIFF(n,t.startbreak,@end), DATEDIFF(n,t.startbreak,t.endbreak))) AS newtime
FROM teambreak AS t
WHERE CAST(t.startbreak AS time) 
    BETWEEN CAST(@start AS time) AND CAST(@end AS time) 
    OR CAST(t.endbreak AS time) BETWEEN CAST(@start as time) AND CAST(@end AS time)

Кстати, разрыв должен быть в виде даты-времени, а не времени, потому что приложение фронта Access не поддерживает тип времени.

Давайте начнем в 7:00 утра (первая дата окончания без перерыва - 11: 55 или 4: 55), перерыв в 9:00 - 9:00 по обеденному времени 12:00 - 12:30 вечера.Результат должен составить 40 минут, чтобы добавить дату окончания производства вместо 15 минут.

Таким образом, это будет 7:00 + 4: 55 = 11: 55 + 15 минут (перерыв) = 12: 10 (но невозможно из-за времени обеда), поэтомуреальная дата окончания будет 12:40 вечера (потому что 12 ч - 12:30) выключен)..Моя первая дата окончания результата - 12:10 вечера, но хорошая должна быть 12:40 вечера

1 Ответ

0 голосов
/ 01 февраля 2019

Наконец-то нашёл простой способ на некоторое время ... не реанимирующий CTE

Сначала пока нашел время перерыва в 9: 15-9: 30.это добавляет 15 минут к 11:55.теперь дата окончания 12:10.Во втором цикле он нашел критерии времени обеда, которые прибавляют 30 минут к 12:10.теперь дата окончания 12:40, как я хотел

declare @start as datetime='2019-01-31 07:00'    
declare @end as datetime='2019-01-31 11:55' --prudction end date without break1
declare @newEndDate as datetime    
declare @newAddTime as int=0    
declare @newAddTimeTotal as int=0
set @newEndDate=@end    
while( 1=1)    
begin    
    select @newAddTime=     
    coalesce(sum    
    (    
    case 
        when 
            CAST(@start AS TIME) between cast(t.startbreak  as time ) and     cast(t.endbreak as time) then datediff(n, CAST(@start AS TIME),cast(t.endbreak as time))
        else 
            datediff(n, CAST(t.startbreak AS TIME),cast(t.endbreak as time))
        end),0)
    ,@start=max(t.endbreak) 
    from teambreak t        
    where (cast(@start as time) <cast (t.endbreak as time)  and  cast(@end as time)>     cast(t.startbreak as time))        
    set @end =dateadd(n,@newAddTime,@end);
set  @newAddTimeTotal= @newAddTimeTotal+@newAddTime
    if @newAddTime=0
    break;
end

select @newAddTimeTotal,@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...