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 - 你想要一个日历表,它们非常有用;将索引放在通常是计算值的东西上(如week
或day-of-week
),优化器可以使用它们(尽管我不知道 Access 有多聪明)。对于具有零售日历(4-5-4 或类似)的公司,这是翻译财务日期的最佳数据库方式。假期现在是一个简单的布尔标志。
遗憾的是,使用日历表根本无法提高水平滚动速度——或者至少不足以使其可用。我必须处理的列(日期)越多——根据缩放级别、应用程序大小和屏幕分辨率,可能少至 10 或多至 150——速度越慢。为了获得我正在寻找的那种速度,我想我将不得不创建并维护一个“使用”表来跟踪每日预订率——这将是一个痛苦,但我看不到任何其他的绕过它。我愿意接受建议...以上是关于MS ACCESS – 返回一个日期范围内的每日预订资源计数的主要内容,如果未能解决你的问题,请参考以下文章