3

「日付」列を持つテーブルがあります。日付は循環形式でカレンダーに表示されます。たとえば、レコードの日付は、特定の日付 (TerminationDate としましょう) まで、毎週特定の日にカレンダーに表示されます。私の表で要約すると、次のような Date 列と 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でこれを達成する方法を知っている人はいますか?

4

3 に答える 3

1

これでうまくいくはずです

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

編集:

上記のクエリは忘れてください。行はそれ自体とのみ接続する必要があるため、

connect_by prior title = title 

ただし、これはループを作成する必要があることを意味します。残念ながら、ループがある場合、Oracle connect by 句はエラーをスローします。使っても

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)

混乱またはパフォーマンスの問題があることを知らせてください

于 2013-08-12T10:45:10.140 に答える
0

これを行うもう1つの方法は次のとおりです

SELECT 
  *,
  date + ( ROWNUM * 7 ) as modified_date
FROM (
  SELECT 
    title, 
    date,
    termination_date 
  FROM 
   table 
 ) WHERE date + ( ROWNUM * 7 ) < termination_date
于 2013-08-12T15:38:45.413 に答える