首页 > 解决方案 > 根据 SYSDATE 获取特定月份的月度数据

问题描述

我每月运行一次查询,以选择基于月份 JAN、FEB、MAR、APR、SEP OCT、NOV、DEC 的数据。

假设我在 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 与年份匹配记录。

标签: oracleoracle11goracle10g

解决方案


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

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


推荐阅读