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

Откуда:
Сообщений: 204
Блог
DATEDIFF позволяет узнать разницу в днях между двумя датами. Мне нужно получить эту разницу с учетом выходных (субботы и воскресенье не учитывать).

На данный момент, единственный вариант, который я вижу, перебирать в цикле даты, прибавляя к начальной по одному дню, и проверять каждых из них на день недели.

Может я что-то упускаю и есть более удобный вариант?
27 ноя 11, 13:06    [11666379]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
demas
Member

Откуда:
Сообщений: 204
Блог
Чтобы было понятнее - я имею в виду этот вариант:

SET @start = CONVERT(datetime, '23.11.2011', 104)
SET @finish = CONVERT(datetime, '29.11.2011', 104)
SET @result = 0

WHILE @start < @finish
BEGIN
	IF (DATEPART(dw, @start) <> 7) AND (DATEPART(dw, @start) <> 1)
		BEGIN
			SET @result = @result + 1
		END		
	SET @start = DATEADD(dd, 1, @start)
END

PRINT @result
27 ноя 11, 13:19    [11666428]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
qwerty112
Guest
set datefirst 1

;with cte as
(select cast('20111101' as datetime) as dt union all select dt+1 from cte where dt<'20111201')

select count(*) as cnt from cte
where dt between '20111123' and '20111129'
  and datepart(dw, dt) < 6
27 ноя 11, 13:38    [11666483]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
demas
Может я что-то упускаю и есть более удобный вариант?
Для такого лучьше завести таблицу-календарь.
27 ноя 11, 16:02    [11666897]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
DECLARE @D1 DATE='20110913', @D2 DATE='20110926';
SELECT DATEDIFF(DAY,@D1,@D2)
      -DATEDIFF(DAY,  0,@D2)/7*2-CASE DATEDIFF(DAY,0,@D2)%7 WHEN 5 THEN 1 WHEN 6 THEN 2 ELSE 0 END
      +DATEDIFF(DAY,  0,@D1)/7*2+CASE DATEDIFF(DAY,0,@D1)%7 WHEN 5 THEN 1 WHEN 6 THEN 2 ELSE 0 END;
???
27 ноя 11, 16:26    [11666970]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
ChA
Member

Откуда: Москва
Сообщений: 11317
Похоже на задачку с sql-ex.ru
27 ноя 11, 16:36    [11667007]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Ну что-то типа такого:

declare @day1 datetime, @day2 datetime
select @day1 = '20111101',@day2 = '20111127'

select [@day1] = @day1, [@day2] = @day2, DATEDIFF(DAY, @day1, @day2)
select [@day1] = @day1, [@day2] = @day2, DATEDIFF(DAY, @day1, @day2) - DATEDIFF (week, @day1, @day2) * 2

А дальше допиливайте сами... Мне проще было завести календарь и напхать тудыть праздничных дней - где-то до сих пор работает...
27 ноя 11, 16:52    [11667076]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
eduard.kasimov
Member

Откуда:
Сообщений: 206
DECLARE @s AS DATETIME
 ,@e AS DATETIME ;
 
SET @s = '20111101' ;
SET @e = '20111130' ;

SELECT  days / 7 * 5 + days % 7
        - CASE WHEN 6 BETWEEN wd AND wd + days % 7 - 1 THEN 1
               ELSE 0
          END - CASE WHEN 7 BETWEEN wd AND wd + days % 7 - 1 THEN 1
                     ELSE 0
                END
FROM    (SELECT DATEDIFF(day, @s, @e) + 1 AS days
               ,DATEPART(weekday, @s + @@DATEFIRST - 1) AS wd
        ) AS D ;
27 ноя 11, 17:34    [11667187]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
ART-C0DE
Guest
Насчет таблички-календаря - правильное решение.
Для этого и распространяется по банкам hd_list.dbf
А иначе как вы учтете, что суббота была рабочая, а 3 дня в будни - были нерабочими.
27 ноя 11, 19:31    [11667527]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
SIMPLicity_
А дальше допиливайте сами... Мне проще было завести календарь и напхать тудыть праздничных дней - где-то до сих пор работает...

Я лично выбрал среднее из этих решений, завёл календарь праздников а выходные высчитывал математически. Календарик такой примерно
create table Holiday 
( Today DATE NOT NUL PRIMARY KEY
, IsHoliday BIT NOT NULL)
Если день D1 праздничный день то в Holiday будет запись по этому поводу с Today=D1 и IsHoliday=1. Если выходной день D2 отменён, т.е. назначен рабочим, то в Holiday будет запись с Today=D2 и IsHoliday=0. Это я к тому что не все дни в календарь сую, а только праздники и отменённые выходные. Хотя можно и все, в конце концов 365 записей в год, это не такой уж большой объём.
28 ноя 11, 01:31    [11668504]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
Sekoka
Member

Откуда:
Сообщений: 73
DECLARE @start as date, @finish as date
SET @start = CONVERT(datetime, '23.11.2011', 104)
SET @finish = CONVERT(datetime, '28.11.2011', 104)

SELECT DATEDIFF(DAY,@start,@finish)
-CAST((case when DATEPART(WEEKDAY,@start)<>6 then DATEDIFF(WEEK,@start,@finish) else DATEDIFF(WEEK,@start,@finish)-0.5 end)*2 as int)
-(case when DATEPART(WEEKDAY,@finish)=6 then 1 else 0 end)
28 ноя 11, 08:12    [11668654]     Ответить | Цитировать Сообщить модератору
 Re: Разница в днях между двумя днями с учетом выходных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
ZOOKABAKODER
Я лично выбрал среднее из этих решений, завёл календарь праздников а выходные высчитывал математически.
Хотя можно и все, в конце концов 365 записей в год, это не такой уж большой объём.
Конечено, лучьше все.

Хоть запросы проще будут, без "вычисления математически"...
28 ноя 11, 09:08    [11668712]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить