сравните месяц в диапазоне месяцев и получите следующий более высокий месяц через oracle - PullRequest
0 голосов
/ 09 мая 2020

Перефразируя, у меня есть строка в столбце с месяцами вроде «3-6-9-12». Мне нужно получить следующий месяц обработки, сравнив месяц из строки и извлечения (месяц из sysdate). например, в мае месяц 5, поэтому я хочу 6 в качестве следующего месяца из строки. в июле месяц 7, поэтому я должен получить 9, как в следующем месяце. Я хочу сделать это во встроенном запросе, если это возможно. Я пытался с помощью этого запроса получить следующий месяц -

select instr (x, extract (month from sysdate)) + 1 from (select listagg (to_number (regexp_substr ((extract (month from sysdate)) || '-3-6-2-12'), '[^ -] +', 1, уровень)), '-') внутри группы (в порядке to_number (regexp_substr ((extract (month from sysdate) || '- 3-6-2-12 '),' [^ -] + ', 1, level))) x из двойного соединения с помощью regexp_substr ((extract (month from sysdate) ||' -3-6-2-12 ' ), '[^ -] +', 1, level) не является нулевым порядком по to_number (x))

Пожалуйста, помогите, если есть другой лучший способ найти следующий месяц в sql.

1 Ответ

0 голосов
/ 09 мая 2020

Вы можете просто сопоставить месяц и четверть, а затем выбрать четверть

     with date_mapping as(select 1 month,3 quater from dual union all
                         select 2 month,3 quater from dual union all
                         select 3 month,3 quater from dual union all
                         select 4 month,6 quater from dual union all
                         select 5 month,6 quater from dual union all
                         select 6 month,6 quater from dual union all
                         select 7 month,9 quater from dual union all
                         select 8 month,9 quater from dual union all
                         select 9 month,9 quater from dual union all
                         select 10 month,12 quater from dual union all
                         select 11 month,12 quater from dual union all
                         select 12 month,12 quater from dual),
     data as (select   date '2020-12-01' date1 from dual)
     select ds.quater from data dd ,date_mapping ds
     where extract (month from dd.date1)=ds.month

ЕСЛИ ваш Quater не исправлен, вы можете использовать ниже

WITH quaters
 AS (SELECT to_number(Regexp_substr(quaters, '[^-]+', 1, LEVEL)) quater
     FROM   (SELECT ( '1-4-7-10' ) AS quaters
             FROM   dual)
     CONNECT BY LEVEL <= Regexp_count(quaters, '[^-]+')),
 min_max_quater
 AS (SELECT Max(quater) max_quater,
            Min(quater) min_quater
     FROM   quaters),
 date_mapping
 AS (SELECT lvl         month,
            Min(quater) quater
     FROM   dual,
            quaters
            cross join (SELECT LEVEL lvl
                        FROM   dual
                        CONNECT BY LEVEL < = 12)
     WHERE  lvl <= quater
     and lvl <> quater
     GROUP  BY lvl
     UNION ALL
     SELECT LEVEL month,
            min_quater
     FROM   min_max_quater
     WHERE  LEVEL > max_quater
     CONNECT BY LEVEL <= 12
     UNION ALL
     SELECT max_quater,
            min_quater
            FROM 
        min_max_quater
     )
  SELECT ds.quater
   FROM   dual dd,
   date_mapping ds
  WHERE  Extract (month FROM sysdate) = ds.month 
...