Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Цепочки дат  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Есть табличка с последовательными мероприятиями и их их плановой длительностью в рабочих днях (имеется таблица выходных и праздничных дней).
На вход приходит дата. Нужно от этой даты вычислить для каждого мероприятия дату начала и окончания.
Мой ход мыслей:
1. К входящей дате я добавляю общую длительность всех мероприятий и до кучи умножаю на 10 (максимальная длительность праздников) чтобы получить максимальный теоретическое окончание
2. Создаю табличку всех дат в диапазоне Входящая дата- Максимальная дата.
3. Удаляю из этой таблички все даты, имеющиеся в таблице выходных дней, получаю таблицу рабочих дней по порядку.
4. Для каждого мероприятия вычисляю номер дня начала и номер дня окончания
5. Вместо номеров начала и окончания вставляю даты (порядковый номер в таблице дат рабочих дней).

Собственно вся проблема с пунктом 4. Мой сервер знает функции LAG и LEAD, но как-то не получается выстроить без курсоров номера дней начал и окончаний

CREATE TABLE [dbo].[Пример](
[Приоритет] [int] NOT NULL,
[Задача] [varchar](50) NOT NULL,
[Длительность] [int] NOT NULL,
[Начало] [date] NULL,
[Окончание] [date] NULL
) ON [PRIMARY]

declare @НачальнаяДата date='20170215'
declare @КонечнаяДата date

set @КонечнаяДата= dateadd(day, (select sum(Длительность) from [dbo].Пример)*10, @НачальнаяДата)

Declare @Dates table (Дата date)
Declare @num int, @pos int

Set @num = datediff(day, @НачальнаяДата, @КонечнаяДата)
Set @pos = 0

WHILE @pos <= @num

BEGIN
Insert into @Dates
Select dateadd(day, @pos, @НачальнаяДата)
Set @pos = @pos + 1
END

select * from @Dates
where Дата not in (select Дата from dbo.НерабочиеДни)

...


Предполагается, что в дальнейшем между мероприятиями могут вставляться новые и нужно будет проводить пересчёт всех последующих мероприятий
24 мар 17, 12:41    [20329177]     Ответить | Цитировать Сообщить модератору
 Re: Цепочки дат  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2202
Денис Б.,
Все мероприятия идут строго последовательно?
24 мар 17, 12:46    [20329195]     Ответить | Цитировать Сообщить модератору
 Re: Цепочки дат  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Денис Б.,

всё решает простая таблица календарь
24 мар 17, 12:46    [20329199]     Ответить | Цитировать Сообщить модератору
 Re: Цепочки дат  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
п.4. сделал так (можно пинать):

select
Приоритет
,Задача
,Длительность
,Окончание-Длительность+1 as Начало
,Окончание
from
(
select distinct
t.Приоритет
,t.Задача
,t.Длительность
,sum(t1.Длительность) over (partition by t.Приоритет) as Окончание
from [dbo].[Пример] t
join [dbo].[Пример] t1 on (t1.Приоритет <= t.Приоритет)
) x
24 мар 17, 14:22    [20329716]     Ответить | Цитировать Сообщить модератору
 Re: Цепочки дат  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
order только надо только ещё правильно засунуть
24 мар 17, 14:35    [20329764]     Ответить | Цитировать Сообщить модератору
 Re: Цепочки дат  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
select distinct
t.Приоритет
,t.Задача
,t.Длительность
,sum(t1.Длительность) over (partition by t.Приоритет)-t.Длительность+1 as Начало
,sum(t1.Длительность) over (partition by t.Приоритет) as Окончание
from [dbo].[Пример] t
join [dbo].[Пример] t1 on (t1.Приоритет <= t.Приоритет)
order by t.Приоритет
24 мар 17, 14:47    [20329801]     Ответить | Цитировать Сообщить модератору
 Re: Цепочки дат  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2202
Денис Б.,
вы мягко говоря все сильно усложняете.
У вас есть табличка с выходными, праздничными и рабочими днями.
Для каждой задачи можно рассчитать количество рабочих дней до начала мероприятия - это сумма длительности всех мероприятий с меньшим приоритетом.
Есть текущая дата, есть количество рабочих дней до начала КАЖДОГО мероприятия, есть табличка календарь с рабочими днями.
Дальше достаточно тривиально.
24 мар 17, 14:57    [20329853]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить