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

Тема в разделе "SQL", создана пользователем Истребитель, 6 июл 2010.

  1. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Добрый день.

    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

    Я сделал это, создав функцию с рекурсивным запросом, который выдает для интервала набор дат
    Код (Text):
    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 итераций, после чего рекурсивный запрос выдает ошибку)

    Подскажите плиз, опытные гуру!
     
  2. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Окей, второй пункт догадался как:
    нужно сделать Multi Statement Table function
    Код (Text):
    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
    И соответственно лефт джойном таблицы... работает на любое количество дат.

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

Поделиться этой страницей