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 t1, d1 + (7 * LEVEL), termination_date
      FROM tab
     WHERE d1 + (7 * LEVEL) < termination_date
   CONNECT BY LEVEL <= CEIL( (termination_date - d1) / 7);

编辑

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)
);
于 2013-08-12T08:54:20.620 回答
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 返回结果,但只返回第一条记录,即 date + 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

这是另一种方法

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 回答