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

Откуда:
Сообщений: 16
Всем доброго времени суток!
Нужна помощь в рабочей задаче.
Задача заключается в том, что бы к полученной дате прибавить 5 рабочих дней, НО с учетом выходных, праздников (не рабочий будний день) и отмененных выходных (рабочий день в выходной). Как я понимаю, необходимо двигаться в направлении использования таблицы с календарем, в ней поля "дата" - дата и "выходной" - 0 - рабочий день, 1 - выходной.
В результате, если прибавить к '2012-06-05 22:05:22' пять рабочих дней, мне нужно получить '2012-06-13 22:05:22' т.к. 09.06 был рабочий день, а 10,11 и 12 выходные...

Может у кого то есть пример подобного запроса? В какую сторону идти?
26 июн 12, 17:33    [12778328]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
в сторону таблицы с датами.
26 июн 12, 17:42    [12778412]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
proof666
пример подобного запроса?


Именно ПОДОБНЫХ - без проблем:

1. http://www.sqlcmd.ru/snpv/mjali
2. http://www.sqlcmd.ru/snpv/ojemp
26 июн 12, 18:28    [12778756]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
proof666
Member

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

Спасибо за примеры!

Запрос ниже выдает количество дней между датами, как его переделать так, чтобы он выдавал дату, с которой у @startdate datediff=5? т.е. плюсовал бы к @endDate один день, до тех пор, пока @k не станет равно 5?
DECLARE  @startDate datetime, @endDate datetime, @d datetime, @k int

SET @startDate='20110307' --the older date
SET @endDate='20110310' --the younger date

DECLARE @holidays TABLE (d datetime) --this table hold the NOT Saturdays/Sundays which nevertheless IS holidays
INSERT INTO @holidays VALUES ('20110107')
INSERT INTO @holidays VALUES ('20110223')
INSERT INTO @holidays VALUES ('20110308')
INSERT INTO @holidays VALUES ('20110509')
INSERT INTO @holidays VALUES ('20111104')

DECLARE @businessdays TABLE (d datetime) --this table hold the Saturdays/Sundays which nevertheless IS NOT holidays
INSERT INTO @businessdays VALUES ('20110507')
INSERT INTO @businessdays VALUES ('20110626')
INSERT INTO @businessdays VALUES ('20110731')
INSERT INTO @businessdays VALUES ('20111106')

SET @k = DATEDIFF(dd,@startDate,@endDate)
SET @d = CONVERT(datetime, @startDate)
WHILE @endDate > @d
BEGIN
    SET @d = DATEADD(dd,1,@d)
    IF EXISTS(SELECT * FROM @businessdays WHERE d=@d) CONTINUE
    IF EXISTS(SELECT * FROM @holidays WHERE d=@d) BEGIN SET @k=@k-1 CONTINUE END
    IF DATEPART(dw,@d) IN (1,7) SET @k=@k-1
END
PRINT @k


Буду очень признателен за помощь!
27 июн 12, 10:03    [12780350]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
proof666
Member

Откуда:
Сообщений: 16
Нашел другое решение, вроде работает:

имеем таблицу:
Dt                      IsHoliday
----------------------- -----------
2012-06-01 00:00:00.000 1
2012-06-02 00:00:00.000 0
2012-06-03 00:00:00.000 0
2012-06-04 00:00:00.000 1
2012-06-05 00:00:00.000 1
2012-06-06 00:00:00.000 1
2012-06-07 00:00:00.000 1
2012-06-08 00:00:00.000 1
2012-06-09 00:00:00.000 1
2012-06-10 00:00:00.000 0
2012-06-11 00:00:00.000 0
2012-06-12 00:00:00.000 0
2012-06-13 00:00:00.000 1
2012-06-14 00:00:00.000 1
2012-06-15 00:00:00.000 1
2012-06-16 00:00:00.000 0
2012-06-17 00:00:00.000 0
2012-06-18 00:00:00.000 1
2012-06-19 00:00:00.000 1
2012-06-20 00:00:00.000 1
2012-06-21 00:00:00.000 1
2012-06-22 00:00:00.000 1
2012-06-23 00:00:00.000 0
2012-06-24 00:00:00.000 0
2012-06-25 00:00:00.000 0
2012-06-26 00:00:00.000 0
2012-06-27 00:00:00.000 0
2012-06-28 00:00:00.000 1
2012-06-29 00:00:00.000 1
2012-06-30 00:00:00.000 0
DECLARE  @StartDate datetime, @EndDate datetime, @finish bit, @CTDay int

SET @StartDate='2012-06-01 05:54:53' -- дата к котрой нужно прибавить рабочие дни

SET @CTDay = 5 --количество прибавляемых дней
SET @finish=0
SET @EndDate=CONVERT(datetime, @StartDate)

WHILE @finish=0
BEGIN
	SET @EndDate=dateadd(dd,1,@EndDate)
	IF EXISTS(select sum(isHoliday) from Calendar where dt between @StartDate and @EndDate having sum(isHoliday) = @CTDay) SET @finish=1
END
Print @EndDate


Как думаете, подойдет как решение? нет никаких "подводных камней"?
27 июн 12, 12:07    [12781566]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
declare @StartDate datetime, @EndDate datetime, @CTDay int;

select
 @StartDate='20120601 05:54:53',
 @CTDay = 5;
 
with cte as
(
 select
  dt, row_number() over (order by dt) as n
 from
  Calendar
 where
  dt > @StartDate and
  IsHoliday = 0
)
select
 dt + cast(@StartDate as time)
from
 cte
where
 n = @CTDay;
27 июн 12, 12:18    [12781671]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
Borodat
Member

Откуда: из прошлого века
Сообщений: 122
proof666,

select top 1 dt from
(
select top @ndays dt from pt where isholiday = 0 and dt>=@strat_dt
)t1
order by dt desc
27 июн 12, 12:35    [12781873]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
proof666
Member

Откуда:
Сообщений: 16
Borodat,
Как я понимаю твой пример вычисляет следующий рабочий день? мне же нужно вычислить разницу в N рабочих дней...
27 июн 12, 12:56    [12782123]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных (и перенесенных рабочих дней)  [new]
Borodat
Member

Откуда: из прошлого века
Сообщений: 122
proof666
Borodat,
Как я понимаю ... пример вычисляет следующий рабочий день?...

select top 1 dt from
(
select top @ndays dt from pt where isholiday = 0 and dt>@strat_dt
order by dt
)t1
order by dt desc

При
@ndays = 1
- да. А если нужно в обратную сторону - сам уж как-нибудь.
28 июн 12, 10:05    [12786825]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить