如何根据一个月内的天数编写报表查询?

时间:2014-02-07 19:14:57

标签: sql oracle11g

我正在尝试编写一个查询来生成自动报告。此报告将针对上个月应该在每月1日运行的交易运行。我有工作来运行这个报告,每月1日运行。但是如何让这个查询在一个月内选择一天? (某些月份将有30个,有些将有31个,并且根据闰年,没有天数变化)。 这里还有一个要求是我只需要在查询中传递一个参数。下面是我现在的查询示例

select id,name,address,trans_dt from tab1 where trans_dt between to_date('&1','MM-DD-YYYY')-30 AND to_date('&1','MM-DD-YYYY');

以上查询生成最近30天的交易,但如果没有月份的日期是31或28,那将是错误的。我使用oracle 11r2作为数据库。请帮忙写这个。

3 个答案:

答案 0 :(得分:0)

mySQL的

SELECT 
   id,
   NAME,
   address,
   trans_dt 
FROM
   tab1 
WHERE 
   MONTH(trans_dt) = 02 /* Param for month passed in */
AND 
   YEAR(trans_dt) = YEAR(CURDATE())

的Oracle

SELECT 
   id,
   NAME,
   address,
   trans_dt 
FROM
   tab1 
WHERE 
   to_char( dt_column, 'mm' ) = 02 /* Param for month passed in */
AND 
   EXTRACT(YEAR FROM DATE trans_dt) = trunc(sysdate, 'YEAR')

也许这可行吗?我只知道mySQL

答案 1 :(得分:0)

找到解决方案,但忘了在这里回复。这是我的解决方案

select id,name,address,trans_dt from tab1 where trans_dt between trunc(trunc(sysdate,'MM')-1,'MM') and trunc(sysdate,'MM');
上面的

将为您提供从日历到月份的最后一天的报告。

答案 2 :(得分:0)

select id
      ,name
      ,address
      ,trans_dt from tab1 
  where trans_dt between to_date(p_dt,'yyyy-mmm-dd') and add_months(to_date(p_dt,'yyyy-mmm-dd'))