在同一列中,获取日期差异作为天数
In The Same Column, Get The Date Difference As Days
我写了一个简单的查询,returns 一个人的最后两条出勤记录,下面是它如何工作的示例:
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
上面的方法运行良好,现在我正在尝试从日期差异中获取天数。尝试了以下但 returns 两个日期之间的天数不正确,从 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
您可以使用 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;
这会将天数添加到每行的 previous 记录中,因此值不一定相同。您的问题不清楚每一行的值是否应该相同,或者数字是否应该与之前的值相同。
我写了一个简单的查询,returns 一个人的最后两条出勤记录,下面是它如何工作的示例:
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
上面的方法运行良好,现在我正在尝试从日期差异中获取天数。尝试了以下但 returns 两个日期之间的天数不正确,从 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
您可以使用 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;
这会将天数添加到每行的 previous 记录中,因此值不一定相同。您的问题不清楚每一行的值是否应该相同,或者数字是否应该与之前的值相同。