请注意:这不是针对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-07-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')
但我无法弄清楚如何(或者如果)我可以将它们联系在一起以获得所需的结果。这甚至可能吗?
答案 0 :(得分:1)
创建一个名为&#34; calendar&#34;并在其中列出一系列日期,涵盖必要的时间范围。它只需要一个名为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