oracle查询以仅报告半年的上半年或下半年的数据

我有一个报告,根据当前日期,该报告应仅在1月-6月或7月-12月的2个日期范围内显示注册数据。 场景:

  • 如果当前日期是042020,那么我应该显示此范围之间的注册数据:072019-122019
  • 如果当前日期为072020,则我应该显示以下范围内的注册数据:012020-062020
  • 如果当前日期是022021,那么我应该显示以下范围内的注册数据:072020-122020

当前查询报告了他6个月以来的所有查询。

select * from enrollement where enrollement_dt > add_months(sysdate - 6);

oracle中有没有可用的函数可以执行相同的操作,或者如何在单个语句中获得逻辑?

对此的任何帮助都将受到高度赞赏。

评论
  • 维她命
    维她命 回复

    您可以使用以下信息获取注册的开始日期和结束日期

            WITH data
             AS (SELECT To_date('01042020', 'DDMMYYYY') curr_date
                 FROM   dual
                 UNION ALL
                 SELECT To_date('01072020', 'DDMMYYYY')
                 FROM   dual
                 UNION ALL
                 SELECT To_date('01022021', 'DDMMYYYY')
                 FROM   dual),
             d2
             AS (SELECT curr_date,
                        To_date('0107'
                                ||( Extract (year FROM curr_date) - 1 ), 'ddmmyyyy')
                           start_first_half,
                        To_date('3112'
                                ||( Extract (year FROM curr_date) - 1 ), 'ddmmyyyy')
                           end_first_half,
                        To_date('0101'
                                ||Extract (year FROM curr_date), 'ddmmyyyy')
                           start_second_half,
                        To_date('3006'
                                ||Extract (year FROM curr_date), 'ddmmyyyy')
                           end_second_half
                 FROM   data)
        SELECT curr_date,
               CASE
                 WHEN To_char(curr_date, 'MM') >= To_char(start_first_half, 'MM')
                      AND To_char(curr_date, 'MM') <= To_char(end_first_half, 'MM') THEN
                 start_second_half
                 ELSE start_first_half
               END start_date1,
               CASE
                 WHEN To_char(curr_date, 'MM') >= To_char(start_first_half, 'MM')
                      AND To_char(curr_date, 'MM') <= To_char(end_first_half, 'MM') THEN
                 end_second_half
                 ELSE end_first_half
               END end_date1
        FROM   d2