【问题标题】:compare month in a range of months and get next higher month in oracle比较一系列月份中的月份并在 oracle 中获得下一个更高的月份
【发布时间】:2020-08-25 04:00:23
【问题描述】:

换个说法,我在一列中有一个字符串,其月份为“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 ,level)),'-') 组内 (按 to_number(regexp_substr((extract(month from sysdate)||'-3-6-2-12'), '[^-]+', 1 ,level)))x 从 dual 排序 connect by regexp_substr((extract(month from sysdate)||'-3-6-2-12'), '[^-]+', 1 ,level) is not null order by to_number(x))

如果有其他更好的方法可以在 sql 中查找下个月,请提供帮助。

【问题讨论】:

  • 完全不清楚.....(特别是这篇文章:“七月是7,所以我应该通过添加+2得到9作为下个月”)......
  • 但是,既然你知道你的问题是什么,而且问题大约是第12个月,那么看看这个函数MOD
  • 感谢您的及时回复,我会再写一遍-我有一个字符串,其值为“3-6-9-12”,即月份。现在无论我从 sysdate 得到什么月份,都应该与这个字符串进行比较,并将下个月给我。例如对于今天的日期,我将得到 5 作为月份(sysdate)所以现在我应该从字符串中得到 6 作为下个月。如果我当前的月份是 7 月(7),我应该从字符串中得到下个月的 9。希望这次很清楚
  • 不,不清楚,因为七月之后就是八月......
  • 为什么要将这些信息存储在字符串中?如果月份是 12 但字符串中没有 12 会发生什么?

标签: sql oracle sorting listagg


【解决方案1】:

你可以做一个月份和季度的映射,然后选择季度

     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 

【讨论】:

  • 好方法,但我的季度月不固定,它们也可以是 2-5-8-11,我的简单问题是从字符串中获取与当前月份相比的下一个数字。所以在这种情况下,它应该给出 8 作为下一个季度或数字。
  • 给出一个季度月不固定的解决方案
  • 或者我可以得到一个简单的字符串,将我当前的月份也添加到字符串中,而不是在行中,而是在单个列中,就像早先它是 3-6-9-12 我应该得到我的可能月份附加到 3-5-6-9-12 之类的排序字符串中,以便我可以轻松获得下个月的位置。我在上面的问题中粘贴了我的 sql 查询
  • 如果月份是 12 并且您的字符串是 1-4-7-10 那么附加的字符串将是 1-4-7-10-12,您将如何对其进行排序
  • 添加 to_number 因为它考虑了 1-4-7-10 作为字符串检查最新的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2020-09-01
相关资源
最近更新 更多