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

Откуда:
Сообщений: 298
Подскажите пожалуйста:

Есть таблица календарного года - все даты 2015 года, с полями дата (Datetime), день недели (от 0 до 6)- 0 и 6 выходные дни.
Как вычислить дату, если известна начальная дата и количество рабочих дней.
К примеру начальная дата 01.04.2015, количество рабочих дней 21. Нужная дата будет 29.04.2015.
Для календарных дней дата будет 21.04.2015
SELECT 'day',DATEADD(day,21-1,'2015-01-04')

А вот как вычислить дату для рабочих дней? (субботу-6 и воскресенье-0 не считаем).
9 сен 15, 11:23    [18127075]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Scend,

1 мая 2015 года - рабочий день?
9 сен 15, 12:05    [18127357]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Scend,

зачем хранить номер дня недели в таблице?
Для типа DATETIME запись в формате 'YYYY-MM-DD' зависит от параметров соединения, языка и т.д.
9 сен 15, 12:07    [18127375]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
select top 21 * from [Календарь]
where [дата] > 01.04.2015 and [день недели] not in (0,6)


ну и последняя строчка - это ваша дата
9 сен 15, 12:08    [18127381]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
tdn03
Member

Откуда:
Сообщений: 1
Scend, как вариант
DECLARE @days INT,
@d INT,
@date_begin SMALLDATETIME

SET @days=21
SET @d=1
SET @date_begin='2015-01-04'

WHILE @d <= @days
BEGIN
SET @days=@days+CASE WHEN DATEPART(dw,DATEADD(DAY,@d-1,'2015-01-04')) in (6,7) THEN 1 ELSE 0 END
SET @d = @d + 1
END
SELECT 'day',DATEADD(DAY,@days-1,@date_begin)


https://www.sql.ru/faq/faq_topic.aspx?fid=488
9 сен 15, 12:09    [18127385]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
Scend
Member

Откуда:
Сообщений: 298
iap
Scend,

1 мая 2015 года - рабочий день?

Для простоты я праздничные дни не учитывал в вопросе, но в таблице также есть поле is_holiday и все праздничные дни отмечены 1.
Поэтому к вопросу можно добавить, чтобы в том числе не учитывались праздничные дни.
9 сен 15, 12:24    [18127512]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Scend
iap
Scend,

1 мая 2015 года - рабочий день?

Для простоты я праздничные дни не учитывал в вопросе, но в таблице также есть поле is_holiday и все праздничные дни отмечены 1.
Поэтому к вопросу можно добавить, чтобы в том числе не учитывались праздничные дни.
Поскольку выходные иногда переносят, то использовать надо только is_holiday.
При этом правильно заполнять, конечно.
9 сен 15, 12:35    [18127588]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
Макбет
Member

Откуда:
Сообщений: 72
Scend,

вариант попроще
select top 1 full_date from 
(
  select top N full_date from myDates
  where full_date>=@StartDate and is_holiday=0 --или TypeDay not in (6,0)
  order by full_date
) tmp 
order by full_date desc

если нужное число дней величина переменная - используем динамический SQL
DECLARE @sql nvarchar(1000)
SET @sql = .... --формируем
EXEC(@sql) --выполняем
9 сен 15, 12:56    [18127753]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Макбет
вариант попроще

этот вариант уже предложен выше

Макбет
если нужное число дней величина переменная - используем динамический SQL

и на кой тут динамика?

top (@N)
9 сен 15, 13:09    [18127835]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
Макбет
Member

Откуда:
Сообщений: 72
Knyazev Alexey,

пардон конечно ) забыл ) работаю с зоопарком от ms sql 2000 до 2012, привычка писать универсальный код )
9 сен 15, 13:14    [18127882]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить дату рабочих дней  [new]
Scend
Member

Откуда:
Сообщений: 298
Спасибо, пригодились все варианты!
9 сен 15, 17:42    [18129591]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить