【问题标题】:SQL Query for Activity in a specific month [closed]SQL查询特定月份的活动[关闭]
【发布时间】:2013-03-05 14:25:40
【问题描述】:

我们有些人在两个特定日期(例如 2013 年 1 月 15 日至 2013 年 2 月 3 日)之间租房。我的任务是显示一个“活跃”报告,显示每个月有多少活跃出租。例如,这将显示在 1 月计数和 2 月计数中。

对此的任何帮助将不胜感激。我一直在寻找类似的东西,但没有找到任何东西。我对sql的了解主要是简单的添加/更改/删除代码。

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 如何定义一个月的活跃度?您的示例在 1 月和 2 月都有效吗?
  • 我使用的是 SQL 2008,抱歉,第一次在这里发帖。在我的示例中,它在 1 月和 2 月都处于活动状态。我曾尝试使用临时表,但不知道如何开始每个月才能获得这 30 天...

标签: sql reporting


【解决方案1】:
SELECT * FROM `rentals` WHERE `date` BETWEEN '2013-03-04' AND '2013-04-04'

显然将表名和列名替换为您自己的...这是MySQL,您在发布时没有指定您使用的数据库软件。

【讨论】:

  • 我正在使用 SQL 2008,抱歉..但在示例中,他们想要一份月度报告,其中活动恰好超过两个月,应该计算在内。
【解决方案2】:

查找在两个日期之间“活跃”的记录的通用方法是

 ...
 WHERE startDate <= @periodEnd AND endDate >= @periodStart

【讨论】:

  • 我可以理解通用方式,但是要获得 Jan 2013/01---12, 2013/02 - 10, 2013/03 - 13....等的结果,我有吗每月硬编码?
【解决方案3】:

如果您想查找每个月的活动,您需要从月份列表开始,然后将它们与活动记录进行比较。让我假设你每个月都有一个开始。

select months.yyyymm, count(*) as NumActives
from (select distinct to_char(startdate, 'yyyy-mm') as yyyymm
      from activity
     ) as months join
     activity a
     on yyyymm between to_char(a.startdate, 'yyyy-mm') and to_char(a.enddate, 'yyyy-mm')
group by months.yyyymm

我使用 Oracle/Postgres 函数 to_char() 将日期转换为年月表示。其他数据库有其他方法可以实现相同的目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2017-08-28
    • 2020-11-24
    • 1970-01-01
    • 2021-11-08
    • 2022-01-13
    相关资源
    最近更新 更多