我有以下輸出:
| 從日期 | 直到日期 |
|---|---|
| 17.03.2020 | 18.05.2020 |
| 18.05.2020 | 08.06.2020 |
| 21.12.2020 | 01.03.2021 |
| 01.03.2021 | 11.03.2021 |
| 19.10.2021 | 22.10.2021 |
| 2022 年 1 月 10 日 | 2022 年 1 月 14 日 |
| 2022 年 1 月 14 日 | 無效的 |
我需要用這個邏輯計算這兩個日期之間的天數,包括第二個日期:
(18.05.2020 - 17.03.2020) 1 = 63
下一行從第一行結束的同一天開始,則18.05.2020不得計入天差,因此:
08.06.2020 - 18.05.2020
如果until_date是,null那么它將是:
sysdate-from_date
但我正在努力做的是在回圈中獲取下一個元素和前一個元素值,以便我可以比較它們
uj5u.com熱心網友回復:
您可以使用LAG分析功能找到以前的until_date:
SELECT from_date,
until_date,
COALESCE(until_date, TRUNC(SYSDATE)) - from_date
CASE
WHEN LAG(until_date) OVER (ORDER BY FROM_DATE) = from_date
THEN 0
ELSE 1
END
AS difference
FROM table_name;
其中,對于樣本資料:
CREATE TABLE table_name (from_date, until_date) AS
SELECT DATE '2020-03-17', DATE '2020-05-18' FROM DUAL UNION ALL
SELECT DATE '2020-05-18', DATE '2020-06-08' FROM DUAL UNION ALL
SELECT DATE '2020-12-21', DATE '2021-03-01' FROM DUAL UNION ALL
SELECT DATE '2021-03-01', DATE '2021-03-11' FROM DUAL UNION ALL
SELECT DATE '2021-10-19', DATE '2021-10-22' FROM DUAL UNION ALL
SELECT DATE '2022-01-10', DATE '2022-01-14' FROM DUAL UNION ALL
SELECT DATE '2022-01-14', NULL FROM DUAL;
輸出:
從日期 UNTIL_DATE 區別 2020-03-17 00:00:00 2020-05-18 00:00:00 63 2020-05-18 00:00:00 2020-06-08 00:00:00 21 2020-12-21 00:00:00 2021-03-01 00:00:00 71 2021-03-01 00:00:00 2021-03-11 00:00:00 10 2021-10-19 00:00:00 2021-10-22 00:00:00 4 2022-01-10 00:00:00 2022-01-14 00:00:00 5 2022-01-14 00:00:00 無效的 154
如果您想在 PL/SQL 中使用它,則將查詢包裝在游標中并在 PL/SQL 中回圈游標。
BEGIN
FOR r IN (
SELECT from_date,
until_date,
COALESCE(until_date, TRUNC(SYSDATE)) - from_date
CASE
WHEN LAG(until_date) OVER (ORDER BY FROM_DATE) = from_date
THEN 0
ELSE 1
END
AS difference
FROM table_name
) LOOP
DBMS_OUTPUT.PUT_LINE( r.from_date || ', ' || r.until_date || ', ' || r.difference );
END LOOP;
END;
/
until_date或者您可以通過將前一個存盤在 PL/SQL 變數中來做完全相同的事情:
DECLARE
v_until_date DATE;
v_diff NUMBER;
BEGIN
FOR r IN (
SELECT from_date,
until_date
FROM table_name
ORDER BY from_date
) LOOP
v_diff := COALESCE(r.until_date, TRUNC(SYSDATE)) - r.from_date
CASE WHEN v_until_date = r.from_date THEN 0 ELSE 1 END;
DBMS_OUTPUT.PUT_LINE(
r.from_date
|| ', ' || r.until_date
|| ', ' || v_diff
);
v_until_date := r.until_date;
END LOOP;
END;
/
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/492335.html
下一篇:你能幫我在sql中更正這個查詢嗎
