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

Sql oracle查询仅报告上半年或下半年的数据,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一份报告,根据当前日期,它只能显示1-6月或7-12月两个日期范围内的注册数据。 场景: 如果当前日期为042020,则我应显示此范围内的注册数据:072019-122019 如果当前日期为072020,则我应显示此范围内的注册数据:012020-062020 如果当前日期为022021,则我应显示此范围内的注册数据:072020-122020 当前查询报告过去6个月的所有内容及其查询 select * from enrollement where enrollement_dt > a

我有一份报告,根据当前日期,它只能显示1-6月或7-12月两个日期范围内的注册数据。 场景:

如果当前日期为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 TRUNC(SYSDATE) curr_date 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 
您可以在查询中使用它,如下所示

  Select * from enrollment_table a, (WITH data
     AS (SELECT TRUNC(SYSDATE) curr_date 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 ) b
where a.enrollment_date >=b.start_date1
and a.enrollment_date <=b.end_date1

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

        WITH data
         AS (SELECT TRUNC(SYSDATE) curr_date 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 
您可以在查询中使用它,如下所示

  Select * from enrollment_table a, (WITH data
     AS (SELECT TRUNC(SYSDATE) curr_date 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 ) b
where a.enrollment_date >=b.start_date1
and a.enrollment_date <=b.end_date1

您可以尝试以下查询-

select *
from enrollement
WHERE TO_CHAR(enrollement_dt, 'MMYYYY') >= CASE WHEN TO_CHAR(SYSDATE, 'mm') <= '06'
                                                          THEN TO_DATE('07' || EXTRACT(YEAR FROM SYSDATE) - 1, 'MMYYYY') 
                                                ELSE THEN TO_DATE('01' || EXTRACT(YEAR FROM SYSDATE), 'MMYYYY')
                                           END
  AND TO_CHAR(enrollement_dt, 'MMYYYY') <= CASE WHEN TO_CHAR(SYSDATE, 'mm') <= '06'
                                                          THEN TO_DATE('12' || EXTRACT(YEAR FROM SYSDATE) - 1, 'MMYYYY') 
                                                ELSE THEN TO_DATE('06' || EXTRACT(YEAR FROM SYSDATE), 'MMYYYY')
                                           END

您可以尝试以下查询-

select *
from enrollement
WHERE TO_CHAR(enrollement_dt, 'MMYYYY') >= CASE WHEN TO_CHAR(SYSDATE, 'mm') <= '06'
                                                          THEN TO_DATE('07' || EXTRACT(YEAR FROM SYSDATE) - 1, 'MMYYYY') 
                                                ELSE THEN TO_DATE('01' || EXTRACT(YEAR FROM SYSDATE), 'MMYYYY')
                                           END
  AND TO_CHAR(enrollement_dt, 'MMYYYY') <= CASE WHEN TO_CHAR(SYSDATE, 'mm') <= '06'
                                                          THEN TO_DATE('12' || EXTRACT(YEAR FROM SYSDATE) - 1, 'MMYYYY') 
                                                ELSE THEN TO_DATE('06' || EXTRACT(YEAR FROM SYSDATE), 'MMYYYY')
                                           END

基本上你想把时间缩短到半年。但甲骨文不支持这一点

一种方法是计算半年并比较它们。您想要从当前日期算起的前半年。这将是:

select (extract(year from sysdate) * 2 + floor(extract(month from sysdate) - 1) / 6) - 1
from dual
您可以使用相同的公式:

where (extract(year from enrollement_dt) * 2 + floor(extract(month from enrollement_dt) - 1) / 6) - 1 =
       extract(year from sysdate) * 2 + floor(extract(month from sysdate) - 1) / 6) - 1
      )

from dual;
不幸的是,它不能在列上使用索引。所以,我们可以重新讨论这个问题。您可以使用一些日期算法获得当前半年的第一天:

select trunc(sysdate, 'Q') - mod(floor((extract(month from sysdate) - 1) / 3), 2) * interval '3' month
from dual
只需插入where子句即可:


瞧!甚至可以使用索引的表达式。

基本上,您希望将其截断为半年。但甲骨文不支持这一点

一种方法是计算半年并比较它们。您想要从当前日期算起的前半年。这将是:

select (extract(year from sysdate) * 2 + floor(extract(month from sysdate) - 1) / 6) - 1
from dual
您可以使用相同的公式:

where (extract(year from enrollement_dt) * 2 + floor(extract(month from enrollement_dt) - 1) / 6) - 1 =
       extract(year from sysdate) * 2 + floor(extract(month from sysdate) - 1) / 6) - 1
      )

from dual;
不幸的是,它不能在列上使用索引。所以,我们可以重新讨论这个问题。您可以使用一些日期算法获得当前半年的第一天:

select trunc(sysdate, 'Q') - mod(floor((extract(month from sysdate) - 1) / 3), 2) * interval '3' month
from dual
只需插入where子句即可:


瞧!甚至可以使用索引的表达式。

请解释选择日期范围的逻辑。在任何时间点,报告应仅显示前半年数据,即1-6月或7-12月。请解释选择日期范围的逻辑。在任何时间点,报告应仅显示前半年数据,即1-6月或7-12月的小更正是否为and条款之前和之后的其他部分不应包含-1小更正?and条款之前和之后的其他部分不应包含-1小更正