Запрос, разделяющий период во времени "с-по" на дни

09.06.2010
107
0
#1
Добрый день.

1) Ума не приложу как создать вот такой запрос:

Исходные данные: таблица вида

ID, DateFrom, DateTo

Например

1, 01.01.2010 17:00, 03.01.2010 12:00
2, 04.01.2010 12:00, 05.01.2010 14:00
3, 06.01.2010 11:00, 06.01.2010 12:00

Конечные данные: та же таблица но разнесенная по дням

ID, Date, TimeFrom, TimeTo

1, 01.01.2010, 17:00, 23:59
1, 02.01.2010, 00:00, 23:59
1, 03.01.2010, 00:00, 12:00
2, 04.01.2010, 12:00, 23:59
2, 05.01.2010, 00:00, 12:00
3, 06.01.2010, 11:00, 12:00

2) Сделал это через "попу", но хотел бы знать, если ли нормальные идеи, как создать такой запрос:

Исходные данные запроса: DateFrom, DateTo, таблица вида

ID, Date, (data)

Например
с 01.01.2010 по 05.01.2010

1, 01.01.2010, data1
2, 03.01.2010, data2
3, 03.01.2010, data3
4, 04.01.2010, data4

Конечные данные:

Date, (data)

01.01.2010, data1
02.01.2010, null
03.01.2010, data3
03.01.2010, data4
04.01.2010, data4
05.01.2010, null

Я сделал это, создав функцию с рекурсивным запросом, который выдает для интервала набор дат
Код:
ALTER FUNCTION [Fact].[DateRange]
(	

@StartDate Date
,@EndDate Date
)
RETURNS TABLE 
AS
RETURN 
(
WITH DateRange (Date)
AS
(
-- Anchor member definition
SELECT Convert(Date,@StartDate) as Date
UNION ALL
-- Recursive member definition
SELECT Convert(Date,DATEADD(day,1,d.Date)) as Date
from DateRange d
where Date<@EndDate
)
-- Statement that executes the CTE
SELECT Date as Date FROM DateRange
)
После чего лефт джойном исходной таблицы... Но это крайне криво, плюс это не работает, если задать большой интервал (предел вроде 90 или 100 итераций, после чего рекурсивный запрос выдает ошибку)

Подскажите плиз, опытные гуру!
 
09.06.2010
107
0
#2
Окей, второй пункт догадался как:
нужно сделать Multi Statement Table function
Код:
ALTER FUNCTION [Fact].[MSDateRange]
(
@StartDate Date
,@EndDate Date
)
RETURNS 
@DateRange TABLE 
(
-- Add the column definitions for the TABLE variable here
Date Date
)
AS
BEGIN
while @StartDate<=@EndDate
begin
insert into @DateRange values(@StartDate);
set @StartDate=DateAdd(day,1,@StartDate);
end

RETURN 
END
И соответственно лефт джойном таблицы... работает на любое количество дат.

Остался вопрос по первому пункту...