【问题标题】:How to write a Report query based on number of days in a month?如何根据一个月的天数编写报表查询?
【发布时间】:2014-03-05 08:24:15
【问题描述】:

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

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 作为数据库。请帮忙写这个。

【问题讨论】:

  • 您可以使用 last_day 函数获取特定月份的最后一天。 Select * from example_table where start_date is between to_date ('01-01-2014','dd-mm-yyyy') 和 last_day (你的日期) 从移动设备上写,所以请原谅我无法详细说明跨度>
  • 那将不满足我的标准,因为我们希望在每个月的 1 日运行它,所以如果我使用这个函数,它将获得从 1 月 1 日到 2 月 28 日的记录,即 2 个月的数据。它不是每个月都查询一次它的运行情况。

标签: sql oracle11g


【解决方案1】:

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())

甲骨文

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

【讨论】:

  • 感谢您的输入,但在 oracle 中似乎不一样
  • 快速搜索显示:to_char(dt_column, 'mm') -- 返回 01..12 所以可能是 WHERE to_char(trans_dt, 'mm')
  • AND EXTRACT(YEAR FROM DATE trans_dt) = trunc(sysdate, 'YEAR')
【解决方案2】:

找到解决方案,但忘记在此处回复。这是我的解决方案

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

上面将为您提供日历中从每月 1 日到每月最后一天的报告。

【讨论】:

    【解决方案3】:
    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'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 2019-12-18
      • 2019-03-07
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多