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

Откуда: Kazan
Сообщений: 14
Добрый день!
есть тавлица примерно такого вида:
name start_date finish_date
bob 4/23/04 4/25/04
joe 4/17/04 4/20/04
mik 4/16/04 4/17/04

и т.д. довольно много

хочется получить запрос с параметрами from_date и to_date и выводот типа

date name
4/16/04 mik
4/17/04 mik
4/17/04 joe
4/18/04 joe
4/19/04 joe
4/20/04 joe
4/21/04 null
4/22/04 null
4/23/04 bob
4/24/04 bob
4/25/04 bob

как бы это сделать поизящнее?
10 фев 05, 16:00    [1313894]     Ответить | Цитировать Сообщить модератору
 Re: Как получить из границ периода его заполненность?  [new]
aleks2
Guest
1) ваяем вспомог. таблицу Numbers (N int) и заполняем ее достаточным кол-вом
целых от 0 до ...
2)
select x.[Date], t.name
from (select DateAdd(d, N, @from_date) [Date] from Numbers WHERE N<=DATEDIFF(d, @from_date, @to_date)) x
left outer join [тавлица примерно такого вида] t
ON [Date] between t.start_date AND t.finish_date
10 фев 05, 16:13    [1313958]     Ответить | Цитировать Сообщить модератору
 Re: Как получить из границ периода его заполненность?  [new]
dimzenk
Member

Откуда: Kazan
Сообщений: 14
Здорово, а без вспомогательной таблицы можно?
10 фев 05, 16:24    [1314015]     Ответить | Цитировать Сообщить модератору
 Re: Как получить из границ периода его заполненность?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
declare @t table(name varchar(50), start_date datetime, finish_date datetime)
insert @t values('bob', '4/23/04', '4/25/04')
insert @t values('joe', '4/17/04', '4/20/04')
insert @t values('mik', '4/16/04', '4/17/04')

select x.[date],y.[name] from
(
 select dateadd(day,(a.number+b.number*256+c.number*65536),t.d1) as [date]
 from master..spt_values a, master..spt_values b, master..spt_values c
	,(select min(start_date) as d1, max(finish_date) as d2 from @t) t
 where a.type='P' and b.type='P' and c.type='P'
	and c.number<=datediff(day,t.d1,t.d2)/65536 
	and b.number<=(datediff(day,t.d1,t.d2)-c.number*65536)/256
	and a.number<=(datediff(day,t.d1,t.d2)-b.number*256-c.number*65536)
) x left join @t y on x.[date] between y.start_date and y.finish_date
order by 1,2
10 фев 05, 17:07    [1314217]     Ответить | Цитировать Сообщить модератору
 Re: Как получить из границ периода его заполненность?  [new]
dimzenk
Member

Откуда: Kazan
Сообщений: 14
автор
master..spt_values
- это что за зверь такой?
мне потребуется ходить под админской записью сервера чтобы получить доступ к master?
10 фев 05, 18:00    [1314382]     Ответить | Цитировать Сообщить модератору
 Re: Как получить из границ периода его заполненность?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
dimzenk
автор
master..spt_values
- это что за зверь такой?
мне потребуется ходить под админской записью сервера чтобы получить доступ к master?

Нет, доступ к master не требует админских прав. А master..spt_values используется для получения отрезка последовательности натуральных чисел (имхо, самый быстрый способ генерации), очень часто обсуждаемая тема на форуме, см. например генерация значений или Создание таблицы натуральных чисел или Как бы его поизящнее "размножить" записи?, и т.д....
10 фев 05, 18:28    [1314458]     Ответить | Цитировать Сообщить модератору
 Re: Как получить из границ периода его заполненность?  [new]
dimzenk
Member

Откуда: Kazan
Сообщений: 14
спасибо всем, только сейчас осознал, что дело было в размножении записей.
10 фев 05, 18:49    [1314520]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить