如何在Oracle sql中将日期增加1个月

nxowjjhe  于 2023-01-25  发布在  Oracle
关注(0)|答案(2)|浏览(181)

我想增加1个月的订阅月循环,以获得每个客户每月付款日期。
我有这样一张table:
| 识别号|登记日期|认购月份|
| - ------|- ------|- ------|
| 1个|二○二二年一月一日|三个|
| 第二章|二○二二年七月一日|六个|
我想有这样的结果:
| 识别号|登记日期|认购月份|必须支付日期|
| - ------|- ------|- ------|- ------|
| 1个|二○二二年一月一日|三个|二○二二年一月一日|
| 1个|二○二二年一月一日|三个|二○二二年二月一日|
| 1个|二○二二年一月一日|三个|二○二二年三月一日|
| 第二章|二○二二年七月一日|六个|二○二二年七月一日|
| 第二章|二○二二年七月一日|六个|二○二二年八月一日|
| 第二章|二○二二年七月一日|六个|二○二二年九月一日|
| 第二章|二○二二年七月一日|六个|二○二二年十月一日|
| 第二章|二○二二年七月一日|六个|二○二二年十一月一日|
| 第二章|二○二二年七月一日|六个|二○二二年十二月一日|
已尝试此操作,但返回重复。
SELECT ID, ADDMONTHS(REGISTER_DATE,LEVEL) FROM SUBLIST CONNECT BY LEVEL<=SUB_MONTH
任何帮助都将不胜感激。非常感谢。

kknvjkwl

kknvjkwl1#

这里有一个选择:
设置日期格式(您不必执行此操作):

SQL> alter session set nls_date_format = 'yyyy.mm.dd';

Session altered.

样本数据:

SQL> with test (id, register_date, subscribed_month) as
  2    (select 1, date '2022-01-01', 3 from dual union all
  3     select 2, date '2022-07-01', 6 from dual
  4    )

查询从此处开始:

5  select id, register_date, subscribed_month,
  6    add_months(register_date, column_value - 1) must_pay_date
  7  from test cross join table(cast(multiset(select level from dual
  8                                           connect by level <= subscribed_month
  9                                          ) as sys.odcinumberlist))
 10  order by id, register_date, must_pay_date;

        ID REGISTER_D SUBSCRIBED_MONTH MUST_PAY_D
---------- ---------- ---------------- ----------
         1 2022.01.01                3 2022.01.01
         1 2022.01.01                3 2022.02.01
         1 2022.01.01                3 2022.03.01
         2 2022.07.01                6 2022.07.01
         2 2022.07.01                6 2022.08.01
         2 2022.07.01                6 2022.09.01
         2 2022.07.01                6 2022.10.01
         2 2022.07.01                6 2022.11.01
         2 2022.07.01                6 2022.12.01

9 rows selected.

SQL>
x33g5p2x

x33g5p2x2#

可以将数据内部联接到包含要添加月数的行的子查询:

WITH
    tbl (ID, REGISTER_DATE, SUBSCRIBED_MONTH) AS
        (
            Select 1, DATE '2022-01-01', 3 From Dual Union All
            Select 2, DATE '2022-07-01', 6 From Dual
        )
SELECT      t0.ID, t0.REGISTER_DATE, t0.SUBSCRIBED_MONTH,
            Add_Months(t0.REGISTER_DATE, t1.MNTHS - 1) "PAY_DATE",
            t1.MNTHS "PAYMENT_NO"
FROM        tbl t0
INNER JOIN  ( Select DISTINCT ID, LEVEL "MNTHS" From tbl Connect By LEVEL <= SUBSCRIBED_MONTH ) t1 ON(t1.ID = t0.ID)
ORDER BY    t0.ID, t0.REGISTER_DATE, t1.MNTHS

使用您的样本数据

WITH
    tbl (ID, REGISTER_DATE, SUBSCRIBED_MONTH) AS
        (
            Select 1, DATE '2022-01-01', 3 From Dual Union All
            Select 2, DATE '2022-07-01', 6 From Dual
        )

...结果是...

ID REGISTER_DATE SUBSCRIBED_MONTH PAY_DATE  PAYMENT_NO
---------- ------------- ---------------- --------- ----------
         1 01-JAN-22                    3 01-JAN-22          1 
         1 01-JAN-22                    3 01-FEB-22          2 
         1 01-JAN-22                    3 01-MAR-22          3 
         2 01-JUL-22                    6 01-JUL-22          1 
         2 01-JUL-22                    6 01-AUG-22          2 
         2 01-JUL-22                    6 01-SEP-22          3 
         2 01-JUL-22                    6 01-OCT-22          4 
         2 01-JUL-22                    6 01-NOV-22          5 
         2 01-JUL-22                    6 01-DEC-22          6

相关问题