Как "растянуть" после Select
От: Аноним  
Дата: 19.10.11 15:42
Оценка:
Привет!

Подскажите кто-нибудь можно ли преобразовать следующую таблицу

ID     DateFrom       DateTo
1      '2011-01-20'   '2011-01-25'


в такую:
ID     Date
1      '2011-01-20'
1      '2011-01-21'
1      '2011-01-22'
1      '2011-01-23'
1      '2011-01-24'
1      '2011-01-25'


короче говоря "заполнить" пробелы.

Заранее спасибо.
Re: Как "растянуть" после Select
От: Sergey Lizin Россия  
Дата: 19.10.11 16:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите кто-нибудь можно ли преобразовать следующую таблицу

А>
А>ID     DateFrom       DateTo
А>1      '2011-01-20'   '2011-01-25'
А>

А>в такую:
А>
А>ID     Date
А>1      '2011-01-20'
А>1      '2011-01-21'
А>1      '2011-01-22'
А>1      '2011-01-23'
А>1      '2011-01-24'
А>1      '2011-01-25'
А>

А>короче говоря "заполнить" пробелы.

Без дополнительных средств никак.
Из доп. средств — хранить где-нибудь календарь и на него джойнить.
А вообще это целая наука — temporal databases.
Re: Как "растянуть" после Select
От: ASta Украина  
Дата: 19.10.11 16:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет!


А>Подскажите кто-нибудь можно ли преобразовать следующую таблицу


А>
А>ID     DateFrom       DateTo
А>1      '2011-01-20'   '2011-01-25'
А>


А>в такую:

А>
А>ID     Date
А>1      '2011-01-20'
А>1      '2011-01-21'
А>1      '2011-01-22'
А>1      '2011-01-23'
А>1      '2011-01-24'
А>1      '2011-01-25'
А>


А>короче говоря "заполнить" пробелы.


А>Заранее спасибо.


stored procedure?
Re: Как "растянуть" после Select
От: Lloyd Россия  
Дата: 19.10.11 16:47
Оценка: 6 (1)
Здравствуйте, Аноним, Вы писали:

А>короче говоря "заполнить" пробелы.


А>Заранее спасибо.


Если используете SQL Server, то можно попробовать вот так:

DECLARE @intervals TABLE (Id INT, DateFrom DATETIME, DateTo DATETIME)

INSERT INTO @intervals VALUES (1, '2011-01-20', '2011-01-25');
INSERT INTO @intervals VALUES (2, '2011-02-10', '2011-02-23');

WITH t(Id, [Date]) AS
(
    SELECT Id, DateFrom FROM @intervals
    UNION ALL
    SELECT t.Id, DATEADD(d, 1, [Date]) 
    FROM t
    JOIN @intervals i ON i.Id = t.Id
    WHERE t.[Date] < i.DateTo
)
SELECT * FROM t
ORDER BY 2
Re[2]: Как "растянуть" после Select
От: Аноним  
Дата: 19.10.11 18:53
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Аноним, Вы писали:


А>>короче говоря "заполнить" пробелы.


А>>Заранее спасибо.


L>Если используете SQL Server, то можно попробовать вот так:


L>
L>DECLARE @intervals TABLE (Id INT, DateFrom DATETIME, DateTo DATETIME)

L>INSERT INTO @intervals VALUES (1, '2011-01-20', '2011-01-25');
L>INSERT INTO @intervals VALUES (2, '2011-02-10', '2011-02-23');

L>WITH t(Id, [Date]) AS
L>(
L>    SELECT Id, DateFrom FROM @intervals
L>    UNION ALL
L>    SELECT t.Id, DATEADD(d, 1, [Date]) 
L>    FROM t
L>    JOIN @intervals i ON i.Id = t.Id
L>    WHERE t.[Date] < i.DateTo
L>)
L>SELECT * FROM t
L>ORDER BY 2
L>


Супер, мегамозг! Знаю что надо рекурсию использовать но никак не могу постичь я этот оператор ;with

Спасибо!
Re: Как "растянуть" после Select
От: Funny Rabbit Россия  
Дата: 20.10.11 05:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет!


На оракле.

SELECT     t.ID, t.date_from + LEVEL - 1 AS d
      FROM (SELECT 1 AS ID, TO_DATE ('20.10.2011', 'dd.mm.yyyy') AS date_from,
                   TO_DATE ('25.10.2011', 'dd.mm.yyyy') AS date_to
              FROM DUAL) t
CONNECT BY LEVEL <= t.date_to - t.date_from + 1
То что меня не убивает, делает меня умнее.
Re: Как "растянуть" после Select
От: GarryIV  
Дата: 20.10.11 09:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет!


А>Подскажите кто-нибудь можно ли преобразовать следующую таблицу


А>
А>ID     DateFrom       DateTo
А>1      '2011-01-20'   '2011-01-25'
А>


А>в такую:

А>
А>ID     Date
А>1      '2011-01-20'
А>1      '2011-01-21'
А>1      '2011-01-22'
А>1      '2011-01-23'
А>1      '2011-01-24'
А>1      '2011-01-25'
А>


А>короче говоря "заполнить" пробелы.


Для Oracle см Oracle Pipelined Table Functions.
WBR, Igor Evgrafov
Re[2]: Как "растянуть" после Select
От: AmKad  
Дата: 22.10.11 20:53
Оценка:
Парочка вариантов для Oracle
with s as(
select 1 id, date '2011-01-20' DateFrom, date '2011-01-25' DateTo from dual union all
select 2 id, date '2011-02-10' DateFrom, date '2011-02-15' DateTo from dual)
select id, DateFrom + level - 1 dt
from s 
connect by prior id = id and DateFrom + level - 1 <= DateTo and prior dbms_random.value is not null;

ID                     DT                        
---------------------- ------------------------- 
1                      20-01-2011 00:00:00       
1                      21-01-2011 00:00:00       
1                      22-01-2011 00:00:00       
1                      23-01-2011 00:00:00       
1                      24-01-2011 00:00:00       
1                      25-01-2011 00:00:00       
2                      10-02-2011 00:00:00       
2                      11-02-2011 00:00:00       
2                      12-02-2011 00:00:00       
2                      13-02-2011 00:00:00       
2                      14-02-2011 00:00:00       
2                      15-02-2011 00:00:00       

 12 rows selected 

with s as(
select 1 id, date '2011-01-20' DateFrom, date '2011-01-25' DateTo from dual union all
select 2 id, date '2011-02-10' DateFrom, date '2011-02-15' DateTo from dual)
select id, dt
from s
model
partition by (rownum id)
dimension by (0 d)
measures (DateFrom, DateTo - DateFrom n, sysdate dt)
rules
(dt[for d from 0 to n[0] increment 1] = DateFrom[0] + cv(d) 
);

ID                     DT                        
---------------------- ------------------------- 
1                      20-01-2011 00:00:00       
1                      21-01-2011 00:00:00       
1                      22-01-2011 00:00:00       
1                      23-01-2011 00:00:00       
1                      24-01-2011 00:00:00       
1                      25-01-2011 00:00:00       
2                      10-02-2011 00:00:00       
2                      11-02-2011 00:00:00       
2                      12-02-2011 00:00:00       
2                      13-02-2011 00:00:00       
2                      14-02-2011 00:00:00       
2                      15-02-2011 00:00:00       

 12 rows selected
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.