在Oracle中每月根据日期列获取数据的通用查询

时间:2015-12-04 09:28:36

标签: sql oracle

我有一个任务,我需要每个月生成一次报告,让我们说每个月的第1天。我尝试过多种方式,但每次我需要修改查询以获取特定月份的数据。

我使用以下查询来获取11月的数据:

Select * from user 
where m_termination_dt>(sysdate-30) and m_termination_dt<(sysdate). 

它提供了正确的输出。(我在12月1日运行此查询,因此减去30天)。值得关注的是,11月有30天的工作时间。对于Dec,我必须减去31天而不是30天,这又是人类的参与。那么有什么办法可以在不改变查询的情况下编写查询。

任何人都可以帮助我使用通用查询,以便我可以在我的系统中自动执行该查询。

西

1 个答案:

答案 0 :(得分:1)

Add_months(trunc(sysdate, 'month'), -1)给出了上个月的第一天。 Trunc(sysdate, 'month')表示当月的第一天。 因此,如果您运行此查询,您将获得上个月的数据,这与它有多少天无关:

select * from users 
  where add_months(trunc(sysdate, 'month'), -1) <= m_termination_dt 
    and m_termination_dt < trunc(sysdate, 'month')

示例:

create table users (id number(5), m_termination_dt date);
insert into users values (1, date '2015-11-01');
insert into users values (2, date '2015-11-18');
insert into users values (3, date '2015-11-30');
insert into users values (4, date '2015-12-01');
commit;

查询输出:

    ID M_TERMINATION_DT
------ ----------------
     1 2015-11-01
     2 2015-11-18
     3 2015-11-30