在同一列中,获取日期差异为天

时间:2018-01-24 11:40:19

标签: sql oracle10g

我编写了一个简单的查询,返回一个人的最后两个出勤记录,以下是一个示例:

Id      Date
305351  1/24/2018
305351  1/23/2018
E5671   10/12/2014
E5671   10/11/2014

查询

----Retrieve days from date difference - Starts
SELECT T1.EMPNO,
         T1.ATT_DATE
FROM (
     SELECT T2.EMPNO, T2.ATT_DATE,
            ROW_NUMBER() OVER(PARTITION BY T2.EMPNO ORDER BY T2.ATT_DATE DESC) as rn
            FROM TableName T2 
     )  T1
WHERE T1.rn <= 2
----Retrieve days from date difference - Ends

以上情况很好,现在我正试图从日期差异中获取日期。尝试了以下操作,但从具有JOIN的行到员工ID的两个日期之间返回不正确的天数:

TO_DATE(T1.ATT_DATE) - TO_DATE(T3.ATT_DATE) "DAYS"

预期输出

 Id      Date      Days
305351  1/24/2018  1
305351  1/23/2018  1
E5671   10/12/2014 1
E5671   10/11/2014 1

我猜,在这里犯了一个愚蠢的错误,希望有一个想法让它发挥作用 - 谢谢。

更新1 - 输出可能如下:

预期输出

Id      Date      Days
305351  1/24/2018  1 //(24-01-2018) - (23-01-2018) = Day 1 
E5671   10/12/2014 1 //(12-01-2018) - (11-01-2018) = Day 1

1 个答案:

答案 0 :(得分:1)

您可以使用lag()lead()。例如:

SELECT T1.EMPNO, T1.ATT_DATE,
       (T1.ATT_DATE - T1.prev_att_date) as Days
FROM (SELECT T2.*,
             LAG(T2.ATT_DATE) OVER (PARTITION BY t2.EMPNO ORDER BY t2.ATT_DATE) as prev_att_date
             ROW_NUMBER() OVER (PARTITION BY T2.EMPNO ORDER BY T2.ATT_DATE DESC) as rn
      FROM TableName T2 
     )  T1
WHERE T1.rn <= 2;

这会将日期放在每行的上一个记录中,因此值不一定相同。您的问题不清楚每行的值是否应该相同,或者数字是否应该是之前的值。