我有一個日期列,我需要回傳從開始日期到結束日期的每一天。例如,如果我有一個從01-01-2020 until開始的日期列22/03/2022。然后我想回傳資料,例如:
| 日期列 |
|---|
| 20 年 1 月 1 日 |
| 20 年 1 月 2 日 |
| 20 年 1 月 3 日 |
| 等等...... |
| 直到 22-MAR-22 |
uj5u.com熱心網友回復:
從甲骨文 12:
SELECT t.id, d.day
FROM table_name t
CROSS JOIN LATERAL (
SELECT t.start_date LEVEL - 1 AS day
FROM DUAL
CONNECT BY t.start_date LEVEL - 1 <= t.end_date
) d
WHERE t.start_date <= t.end_date
在 Oracle 12 之前,您可以使用:
SELECT t.id, d.COLUMN_VALUE AS day
FROM table_name t
CROSS JOIN TABLE(
CAST(
MULTISET(
SELECT t.start_date LEVEL - 1
FROM DUAL
CONNECT BY t.start_date LEVEL - 1 <= t.end_date
)
AS SYS.ODCIDATELIST
)
) d
WHERE t.start_date <= t.end_date
要么:
WITH dates (id, day, end_date) AS (
SELECT id, start_date, end_date
FROM table_name
WHERE start_date <= end_date
UNION ALL
SELECT id, day 1, end_date
FROM dates
WHERE day 1 <= end_date
)
SEARCH DEPTH FIRST BY id, day SET ord
SELECT id, day
FROM dates;
其中,對于樣本資料:
CREATE TABLE table_name (id, start_date, end_date) AS
SELECT 1, DATE '2021-01-01', DATE '2022-03-22' FROM DUAL UNION ALL
SELECT 2, DATE '2022-01-01', DATE '2022-01-10' FROM DUAL;
所有輸出:
ID 日 1 01-JAN-21 1 21 年 1 月 2 日 ... ... 1 22 年 3 月 21 日 1 22-MAR-22 2 22 年 1 月 1 日 2 22 年 1 月 2 日 ... ... 2 22 年 1 月 9 日 2 22 年 1 月 10 日
db<>在這里擺弄
uj5u.com熱心網友回復:
一種選擇也可能是
SQL> WITH
2 test (id, start_date, end_date)
3 AS
4 (SELECT 1, DATE '2020-01-01', DATE '2022-03-22' FROM DUAL)
5 SELECT start_date LEVEL - 1 datecolumn
6 FROM test
7 CONNECT BY LEVEL <= end_date - start_date 1
8 ORDER BY datecolumn;
DATECOLUMN
----------
01.01.2020
02.01.2020
03.01.2020
04.01.2020
<snip>
14.03.2022
15.03.2022
16.03.2022
17.03.2022
18.03.2022
19.03.2022
20.03.2022
21.03.2022
22.03.2022
812 rows selected.
SQL>
如果存在 - 正如 MT0 評論的那樣 - 該表中包含開始/結束日期的不止一行,那么
WITH
test (id, start_date, end_date)
AS
(SELECT 1, DATE '2020-01-01', DATE '2022-03-22' FROM DUAL
UNION ALL
SELECT 2, DATE '2022-03-15', DATE '2022-03-23' FROM DUAL)
SELECT id, start_date COLUMN_VALUE - 1 datecolumn
FROM test
CROSS JOIN
TABLE (
CAST (
MULTISET ( SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= end_date - start_date 1)
AS SYS.odcinumberlist))
ORDER BY id, datecolumn;
uj5u.com熱心網友回復:
您可以創建一個 PIPELINED 函式,您可以在其中插入您想要的日期
CREATE OR REPLACE TYPE nt_date IS TABLE OF DATE;
/
CREATE OR REPLACE FUNCTION generate_dates_pipelined(
p_from IN DATE,
p_to IN DATE
)
RETURN nt_date PIPELINED DETERMINISTIC
IS
v_start DATE := TRUNC(LEAST(p_from, p_to));
v_end DATE := TRUNC(GREATEST(p_from, p_to));
BEGIN
LOOP
PIPE ROW (v_start);
EXIT WHEN v_start >= v_end;
v_start := v_start INTERVAL '1' DAY;
END LOOP;
RETURN;
END generate_dates_pipelined;
/
SELECT
c.COLUMN_VALUE
FROM
TABLE(generate_dates_pipelined(DATE '2022-01-01',
DATE '2022-01-30')) c
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448749.html
