根据SYSDATE

时间:2018-12-14 03:28:16

标签: oracle oracle11g oracle10g

我每月运行一次查询以选择 月JAN,FEB,MAR,APR,SEP为基础的数据 十月,十一月,十二月。

可以说我正在2018年2月运行此查询,然后是数据 JAN和FEB的数据应来自当年(2018)和MAR,APR,SEP的数据 OCT,NOV,DEC应来自上一年(2017年)。我如何使用SYSDATE处理此问题。

>SELECT * FROM MY_TABLE WHERE MONTH_NAME 
IN ('JAN','FEB','MAR','APR','SEP','OCT','NOV','DEC') 
AND 
YEAR=TO_CHAR(TRUNC(SYSDATE),'YYYY');

假设我的MONTH_NAME列具有所有月份名称,而YEAR和年份则与记录匹配。

2 个答案:

答案 0 :(得分:2)

没有示例数据,很难说出您到底想要什么,但是可能是这样的。

SELECT * 
  FROM   my_table 
WHERE  month_name IN ( 'JAN', 'FEB', 'MAR', 'APR', 
                       'SEP', 'OCT', 'NOV', 'DEC' ) 

AND ( 
      ( EXTRACT ( MONTH FROM TO_DATE( month_name ,'MON' ) ) 
                    <= EXTRACT ( MONTH FROM SYSDATE ) AND YEAR = 2018) OR
      ( EXTRACT ( MONTH FROM TO_DATE( month_name ,'MON' ) ) 
                  >  EXTRACT ( MONTH FROM SYSDATE ) AND YEAR = 2017)
    )

最好将'NLS_DATE_LANGUAGE = ENGLISH'添加为TO_DATE的第3个参数

答案 1 :(得分:0)

如果没有示例数据,我建议采用以下方法:

  • 获取所需日期列表
select  add_months(
            trunc(sysdate,'mm'),
            - level + 1
        )
  from  dual
connect by level <= 12;

此查询将返回过去 11 个月的第一天和当前月份

  • 然后将此查询的结果加入到您的表中