SQL查找日期差-Oracle

时间:2019-07-08 12:38:32

标签: sql oracle date

我有一张桌子:

表1

tran_id    user_id    start_date    end_date
1          100        01-04-2018    02-04-2018
2          100        14-06-2018    14-06-2018
4          100        12-06-2018    12-06-2018
7          101        05-01-2018    05-01-2018
9          101        08-01-2018    08-01-2018
3          101        03-01-2018    03-01-2018

日期格式为DD-MM-YYYY

我需要找到按user_idstart_date排序的日差。查找日差的公式是减去前一个记录的end_date和下一个记录的start_date

这是预期的输出:

tran_id    user_id    start_date    end_date       day_diff
1          100        01-04-2018    02-04-2018     71
4          100        12-06-2018    12-06-2018     2
2          100        14-06-2018    14-06-2018     0

3          101        03-01-2018    03-01-2018     2
7          101        05-01-2018    05-01-2018     3
9          101        08-01-2018    08-01-2018     0

如何在SQL查询中获取此信息?

4 个答案:

答案 0 :(得分:1)

使用函数lead()查找下一个值,然后减去日期:

select tran_id, user_id, start_date, end_date, nvl(nsd - start_date, 0) diff
  from (
    select t.*, lead(start_date) over (partition by user_id 
                                       order by start_date) nsd 
      from table1 t)

demo

答案 1 :(得分:1)

您可以为此使用lead()。由于lead()接受三个参数,因此您不需要子查询或处理null值:

select t.*,
       (lead(start_date, 1, start_date) over (partition by user_id order by start_date) -
        start_date
       ) as diff
from t;

答案 2 :(得分:0)

我认为:DATEDIFF function in OracleLAG function结合可以为您提供帮助。

答案 3 :(得分:0)

对Ponder Stibbons给出的答案的微小修正。差异以粗体突出显示。

选择tran_id,user_id,开始日期,结束日期,nvl(nsd-结束日期,0)diff   来自(     选择t。*,领先(开始日期)超过(按user_id划分)                                        按start_date排序)nsd       从date_test t)开始;

问候 阿卡什(Akash)