Список дат в формате yyyymm за последние 3 месяца для данной даты 2019-12-31 - PullRequest
0 голосов
/ 31 октября 2019

Я хочу получить список дат в формате yyyymm за последние 3 месяца

Для данного input_date неизвестный тип данных

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)

При выполнении вышеупомянутого запроса он дает

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

Fyr_actg_prd является числовым типом данных

ПРОБЛЕМА С ВЫШЕ РЕШЕНИЕМ - input_date без одинарных кавычек, поэтому ошибка

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Вы можете использовать функцию 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 

Демо

0 голосов
/ 31 октября 2019

Не генерируйте все значения, просто используйте 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
);

илирекурсивный подзапрос:

WITH months ( month, idx ) AS (
  SELECT TO_CHAR( :input_date, 'YYYYMM' ),
         1
  FROM   DUAL
UNION ALL
  SELECT TO_CHAR( ADD_MONTHS( :input_date, -idx ), 'YYYYMM' ),
         idx + 1
  FROM   months
  WHERE  idx < 2
)
SELECT *
FROM   table_name
WHERE  fyr_actg_prd IN ( SELECT month FROM months );
0 голосов
/ 31 октября 2019

Попробуйте следующее:

SELECT TO_CHAR(ADD_MONTHS(:INPUT_DATE,-LEVEL+1),'YYYYMM') FROM dual CONNECT BY LEVEL < 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...