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

Откуда:
Сообщений: 503
Может можно оптимизировать запрос по подсчету в определенном периоде дат без праздничных.
Таблица с праздниками есть.

SET LANGUAGE Russian

if object_id('tempdb..#period', 'U') > 0 drop table #period -- Таблица с датами начала и окончания периода

select  cast('2.1.2012' as smalldatetime) dt1, cast('31.1.2012' as smalldatetime) dt2 
into #period union all
select cast('01.3.2012' as smalldatetime) dt1, cast('20.3.2012' as smalldatetime) dt2 


DECLARE @t1 TABLE (HoliDay smalldatetime) --Таблица с праздниками
SET dateformat dmy
insert into @t1
select '01.1.2012' union all
select '07.1.2012' union all
select '08.3.2012' union all
select '01.5.2012' union all
select '02.5.2012' union all
select '09.5.2012' union all
select '28.6.2012' union all
select '24.7.2012' union all
select '3.6.2012' union all
select '15.4.2012'

-- может можно как-то этот запрос опртимизировать?  
SELECT dt1, dt2, (DATEDIFF(day, dt1, dt2) + 1)- count(HoliDay)
FROM #period 
full join @t1 on HoliDay between dt1 and dt2 
where dt2 is not null

GROUP BY dt1, dt2


SQL 2000 SP3
14 июн 12, 18:36    [12715795]     Ответить | Цитировать Сообщить модератору
 Re: Праздничные дни  [new]
aleks2
Guest
-- может можно как-то этот запрос опртимизировать?  

DECLARE @t1 TABLE (HoliDay smalldatetime primary key clustered) --Таблица с праздниками

SELECT dt1, dt2, (DATEDIFF(day, dt1, dt2) + 1)- (select count(*) from @t1 where HoliDay between dt1 and dt2)
FROM #period 
where dt2 is not null
14 июн 12, 19:45    [12716098]     Ответить | Цитировать Сообщить модератору
 Re: Праздничные дни  [new]
32sasha
Member

Откуда:
Сообщений: 503
Что-то не получается применить к реальным данным и к запросу.
Подскажите пожалуйста.
			select Datediff(dd, Date_of_employment, GETDATE())*28/365 as 'Vacation_days'
		 
			,	sum(DATEDIFF(day, Scheduled_To, Scheduled_For)+1) as 'Plan_Vacation_day_sum' 
			,	sum(DATEDIFF(day, Order_To, Order_For)+1) as 'Order_Vacation_day_sum' 
			,	sum(DATEDIFF(day, Fact_To, Fact_For) +1) as 'Fact_Vacation_day_sum' 

			,	sum(DATEDIFF(day, Scheduled_To, Scheduled_For)+1) as 'Plan_Vacation_day' 
			,	FIO, id_FIO 
			from #Journal_of_holiday 
			GROUP BY FIO, Date_of_employment, id_FIO
15 июн 12, 13:03    [12719272]     Ответить | Цитировать Сообщить модератору
 Re: Праздничные дни  [new]
user89
Member

Откуда:
Сообщений: 2083
32sasha,

Здесь вместо full join можно left поставить
SELECT dt1, dt2, (DATEDIFF(day, dt1, dt2) + 1) - count(HoliDay)
FROM #period 
left join @t1 on HoliDay between dt1 and dt2 
where dt2 is not null
GROUP BY dt1, dt2


А вариант с индексом на таблице праздников, который привел aleks2, наверное самый быстрый.

автор
Что-то не получается применить к реальным данным и к запросу.
Дайте структуру #Journal_of_holiday и заполните данными, близкими к реальным.
15 июн 12, 16:31    [12721612]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить