【问题标题】:getting monthly data for specific months based on SYSDATE根据 SYSDATE 获取特定月份的月度数据
【发布时间】:2019-05-15 08:01:55
【问题描述】:

我每月运行一次查询以选择 基于月份 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 与年份匹配记录。

【问题讨论】:

  • 请告诉规则,在什么情况下您只需要当年的数据,以及什么时候需要以前和当前的数据。
  • 另外添加一些示例数据和预期结果。

标签: oracle oracle11g oracle10g


【解决方案1】:

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

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 的第三个参数

【讨论】:

    【解决方案2】:

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

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

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

    • 然后将此查询的结果连接到您的表中

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多