2013-08-12 3 views
3

У меня есть стол со столбцом «Дата». Дата будет отображаться в календаре в циклической форме. Например, дата записи будет отображаться в календаре в определенный день каждую неделю до определенной даты (скажем, TerminationDate). Подводя итог в моей таблице у меня есть дата и столбцы TerminationDate так:Как повторить выбор запроса, когда дата находится в пределах диапазона?

Table: 
Title | Date | TerminationDate 
------------------------------ 
t1 | d1 | td1 

и я хочу, чтобы добиться чего-то вроде этого:

From query: 
Title | Date | TerminationDate 
------------------------------ 
t1 | d1+7 | td1 
t1 | d1+14| td1 
t1 | d1+21| td1 
.................... till Date < TerminationDate 

Кто-нибудь есть идеи, как добиться этого в Oracle ?

+0

Нужно ли это с SQL или PLSQL? – Harshit

+0

Я хотел бы с SQL, потому что я не очень практичен с PLSQL, но, как вы пожелаете, без проблем :) Спасибо –

ответ

1

Это должно сделать трюк

select distinct title, date + (level * 7), termination_date 
from table 
    connect by date + (level * 7) < termination_date 

EDIT:

Забудьте о запросе выше, так как строки должны быть соединены только с самим собой там должен быть

connect_by prior title = title 

, но это означает, что цикл должен быть создан. К сожалению, Oracle connect by clause выдает ошибку, если есть петля вообще. Даже если вы используете

date + (level * 7) < termination_date 

Oracle по-прежнему прекращает выполнение немедленно, когда обнаруживает цикл во время выполнения. Использование NOCYCLE возвращает результат, но возвращает только первую запись, которая является дата + 7

ОТВЕТ:

Так я должен был подойти к проблеме по-другому

select t.*, date + (r * 7) as the_date 
from table t, 
    (select rownum as r 
     from dual 
    connect by level < (select max(weeks) --max date interval as weeks to be used to repeat each row as much, if you know the max weeks difference you can use the constant number instead of this sub-query 
          from (select ceil((termination_date - date)/7) as weeks 
            from table)) 
) 
where r < ceil((termination_date - date)/7) 

Пусть я знаю, есть ли conufsion или производительность проблема

+0

Спасибо, но в этом случае, как и ответ Гаурава, время обработки слишком велико. Это связано с тем, что запрос обрабатывает снова и снова некоторые записи, у которых дата меньше даты другой записи. Поэтому после обработки каждой записи эти записи, дата которых меньше предыдущей, обрабатываются снова и снова. Любая другая идея? –

+0

Да, вы правы, это слишком много? Сначала это пришло мне в голову. Позвольте мне еще раз взглянуть на – Bren

+0

.. фактически бесконечно из-за того, что я сказал вам выше. Скажите, пожалуйста, любую другую идею, которую вы думаете, должен работать :) –

1

Я не проверял запрос, но он должен работать, как, как вам нужно

SELECT t1, d1 + (7 * LEVEL), termination_date 
     FROM tab 
    WHERE d1 + (7 * LEVEL) < termination_date 
    CONNECT BY LEVEL <= CEIL((termination_date - d1)/7); 

EDIT

SELECT DISTINCT t1,dt,termination_date 
FROM( 
SELECT t1, d1 + (7 * LEVEL) dt, termination_date 
    FROM tab 
WHERE d1 + (7 * LEVEL) < termination_date 
CONNECT BY LEVEL <= CEIL((termination_date - d1)/7) 
); 
+0

Спасибо, но это дает мне только выбор для одной записи, как заставить ее выбрать все случаи для всех записей таблицы? –

+0

Это нормально, извините, что я отвечаю без тестирования. Большое спасибо :) –

+0

Извините меня еще раз, потому что я получаю несколько строк, как всегда, не могли бы вы дать мне подсказку, как сделать этот выбор для каждой строки в моем столе? (все вместе) –

0

Вот еще один способ сделать это

SELECT 
    *, 
    date + (ROWNUM * 7) as modified_date 
FROM (
    SELECT 
    title, 
    date, 
    termination_date 
    FROM 
    table 
) WHERE date + (ROWNUM * 7) < termination_date 
+0

Спасибо, это быстрее, чем выше ответ? –

+0

может быть быстрее в течение нескольких мс, было бы лучше, если бы вы попробовали его против ваших данных, но – Akash

+1

Думаю, у вас возник вопрос не так. Каждая запись должна быть повторена с датой 7 дней позже предыдущего повторения до даты окончания данной записи. Итак, предположим, что в таблице, указанной в вопросе, есть другая запись с заголовком t2, чем t2 следует повторять с датой, увеличивающейся до даты окончания t2 @AlbanoVito – Bren

Смежные вопросы