PL / SQL查找不同行中的开始日期和结束日期之间的差异

时间:2014-10-02 15:31:22

标签: sql oracle date plsql

我试图使用PL / SQL在结果集的不同行中找到开始日期和结束日期之间的差异。这是一个例子:

ID    TERM    START_DATE  END_DATE

423   201420    26-AUG-13   13-DEC-13

423   201430    21-JAN-14   09-MAY-14

423   201440    16-JUN-14   07-AUG-14

对于任何特定的ID,我需要获得第一个记录中的结束日期和第二个记录的开始日期之间的差异。同样,我需要得到第二个记录中的结束日期和第三个记录的开始日期之间的差异,等等。
最终,我需要对各种ID执行相同的操作。我假设我必须使用游标和循环。

对于完成此任务有任何帮助或建议,我将不胜感激。提前谢谢。

4 个答案:

答案 0 :(得分:5)

"lead" analytic function in Oracle可以从后续行中获取值作为当前行中的值。

  

给定从查询返回的一系列行和光标的位置,LEAD提供对超出该位置的给定物理偏移的行的访问。

此处,此SQL从下一行抓取start_date并从当前行中减去end_date

select id, term, start_date, end_date,
       lead(start_date) over (partition by id order by term) - end_date diff_in_days
from your_table;

示例输出:

        ID TERM       START_DATE           END_DATE             DIFF_IN_DAYS
---------- ---------- -------------------- -------------------- ------------
       423 201420     26-AUG-2013 00:00:00 13-DEC-2013 00:00:00           39
       423 201430     21-JAN-2014 00:00:00 09-MAY-2014 00:00:00           36
       423 201440     14-JUN-2014 00:00:00 07-AUG-2014 00:00:00

答案 1 :(得分:0)

我建议使用Oracle的LEAD和LAG分析函数。听到它的声音,它们应该适合你的需要。

请参阅此处的文档:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions074.htm

答案 2 :(得分:0)

代码:

SELECT [ID], [TERM], [START_DATE], [END_DATE],
       CASE WHEN MIN([END_DATE]) OVER(PARTITION BY [ID] ORDER BY [TERM] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)=[END_DATE] THEN NULL ELSE
       MIN([END_DATE]) OVER(PARTITION BY [ID] ORDER BY [TERM] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)-[START_DATE] END AS [DAYS_BETWEEN]
FROM [TABLE]

答案 3 :(得分:0)

这似乎有效:

SELECT DISTINCT ID, TERM_CODE, TERM_START_DATE, TERM_END_DATE, ( ( LEAD ( TERM_START_DATE, 1 ) OVER ( PARTITION BY ID ORDER BY TERM_CODE ) ) -TERM_END_DATE AS DIFF DAYS FROM TABLE