给定日期的最近3个月的yyyymm格式日期列表2019-12-31

时间:2019-10-31 08:45:53

标签: sql oracle

我想要一个过去3个月内[MSBuild]::GetRegistryValue格式的日期列表

对于给定的input_date未知数据类型

yyyymm

必需的输出

Input_date = 2019-12-31 

数值

我想将解决方案查询用作另一个查询的子查询

201912
201911
210910

上面的查询在执行时给出了

Select * from table where fyr_actg_prd in 
(select to_number(to_char(add_months(to_date(input_date,'yyyy-mm-dd'),1-LEVEL), 'yyyymm')) from dual connect by LEVEL <=3)

Fyr_actg_prd是数字数据类型

以上解决方案的问题是input_date没有单引号,所以出错

3 个答案:

答案 0 :(得分:0)

尝试以下操作:

SELECT TO_CHAR(ADD_MONTHS(:INPUT_DATE,-LEVEL+1),'YYYYMM') FROM dual CONNECT BY LEVEL < 4

答案 1 :(得分:0)

您可以在包含add_months()的查询中使用connect by level <= 3函数:

with t as
(
 select date'2019-12-31' as input_date
   from dual     
)
select to_char( add_months(input_date, 1 - level ) , 'yyyymm' ) as months
  from t
 connect by level <=  3 

Demo

答案 2 :(得分:0)

不生成所有值,只需使用sudo apt install liblttng-ust0 libcurl3 libcurl4 libssl1.0.0 libkrb5-3 zlib1g libicu52 libicu55 libicu57 libicu60 libunwind8 libuuid1

BETWEEN

如果要生成值,可以使用分层查询:

SELECT *
FROM   table
WHERE  fyr_actg_prd BETWEEN TO_CHAR( ADD_MONTHS( :input_date, -2 ), 'YYYYMM' )
                    AND     TO_CHAR( :input_date, 'YYYYMM' )

或递归子查询:

SELECT *
FROM   table_name
WHERE  fyr_actg_prd IN (
  SELECT TO_CHAR( ADD_MONTHS( :input_date, LEVEL - 3 ), 'YYYYMM' )
  FROM   DUAL
  CONNECT BY LEVEL <= 3
);