MS ACCESS – 返回一个日期范围内的每日预订资源计数

Posted

技术标签:

【中文标题】MS ACCESS – 返回一个日期范围内的每日预订资源计数【英文标题】:MS ACCESS – Return a daily count of booked resources within a date range 【发布时间】:2014-04-13 20:44:47 【问题描述】:

请注意:这不是针对 Access 项目本身,而是针对后端使用 Access 数据库的遗留应用程序。

设置 该应用程序的一部分是一种甘特图,固定为单日列,其中每一行代表一个资源。资源被预订了一段时间,并且预订是针对单个资源的,因此它们不能连续重叠。视图中的日期范围是用户可选择的、开放式的,并且可以通过各种方法进行更改,包括使用鼠标或键盘进行水平滚动。

问题 我的任务是在图表顶部添加一行以指示每天的总体资源使用情况。当然,通过简单地分别查询范围内的每一天,这很容易做到,但不幸的是,这被证明是一个昂贵的过程,因此会大大减慢水平滚动速度。所以我正在寻找一种更有效的方法,希望能减少数据库读取。

这是一个高度简化的预订表示例:

booking_ID |   start_Date |    end_Date |  resource_ID
----------- -------------- ------------- -------------
         1     2014-07-17    2014-07-20             21
         2     2014-08-24    2014-08-29              4
         3     2014-08-26    2014-09-02             21
         4     2014-08-28    2014-09-04             19

理想情况下,我想要一个查询,该查询返回指定范围内的每一天,以及那些日子有多少预订。因此从 2014 年 7 月 17 日开始查询上述 20 天的数据会产生这样的结果:

check_Date | resources_Used 
----------- ---------------
2014-07-17                1
2014-07-18                1
2014-07-19                1
2014-07-20                1
2014-07-21                0
2014-07-22                0
2014-07-23                0
2014-08-24                1
2014-08-25                1
2014-08-26                2
2014-08-27                2
2014-08-28                3
2014-08-29                3
2014-08-30                2
2014-08-31                2
2014-09-01                2
2014-09-02                2
2014-09-03                1
2014-09-04                1
2014-09-05                0

我可以通过使用整数表(从 0 开始)来获取范围内的日期列表,其中:

SELECT CDATE('2014-07-17') + ID AS check_Date FROM Integers WHERE ID < 20

我可以通过以下方式获取一天使用的资源数量:

SELECT COUNT(*) AS resources_Used 
FROM booking 
WHERE start_Date <= CDATE('2014-09-04')
AND end_Date >= CDATE('2014-09-04')

但我不知道如何(或是否)将它们结合在一起以获得所需的结果。这甚至可能吗?

【问题讨论】:

【参考方案1】:

创建一个名为“日历”的表格,并将涵盖必要时间范围的日期列表放入其中。它只需要一个名为 check_date 的列,每个日期一行。使用 Excel,从任意日期开始并向下拖动,然后导入新表格。

设置日历表后,您可以运行以下命令:

select c.check_date, count(b.resource_id) as resources_used
  from calendar c, bookings b
 where c.check_date between b.start_date and b.end_date
group by c.check_date

【讨论】:

谢谢。这给了我所需的链接方法,但我真的不想写到日历表中,所以我只是用括号中提到的 Integers 查询替换了 from 子句中的 calendar,它似乎工作正常。你能看出这样做有什么问题吗? 使用日历表可能会运行得更快一些,但如果结果相同并且不需要更长的时间,那么应该没问题。如果它是像 oracle 这样更好的数据库,您可以使用 connect by 子句从单行的 start_date 和 end_date 派生行,但我不相信 Access 中有任何此类(至少严格来说不是 sql) 是的,我刚刚发现它并没有我想要的那么快,因为我已经将它插入到应用程序中。它比以前好多了,但不是我想要的,所以接下来我将尝试日历方法。必须是明天,因为它已经过了我的就寝时间了:) @Ants1060 - 你想要一个日历表,它们非常有用;将索引放在通常是计算值的东西上(如weekday-of-week),优化器可以使用它们(尽管我不知道 Access 有多聪明)。对于具有零售日历(4-5-4 或类似)的公司,这是翻译财务日期的最佳数据库方式。假期现在是一个简单的布尔标志。 遗憾的是,使用日历表根本无法提高水平滚动速度——或者至少不足以使其可用。我必须处理的列(日期)越多——根据缩放级别、应用程序大小和屏幕分辨率,可能少至 10 或多至 150——速度越慢。为了获得我正在寻找的那种速度,我想我将不得不创建并维护一个“使用”表来跟踪每日预订率——这将是一个痛苦,但我看不到任何其他的绕过它。我愿意接受建议...

以上是关于MS ACCESS – 返回一个日期范围内的每日预订资源计数的主要内容,如果未能解决你的问题,请参考以下文章

MS Access:从日期时间值返回特定日期的查询

MS-Access 中的多个日期范围

MS Access 日期范围函数减慢查询速度

Mysql 将给定日期范围内的每日总计转化为每周总计

MS Access 根据给定的日期范围选择查询字段

在 MS Access 中插入具有日期范围的多条记录