MS ACCESS - 返回日期范围内每日预订资源的数量

时间:2014-04-13 20:44:48

标签: sql ms-access

请注意:这不是针对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')

但我无法弄清楚如何(或者如果)我可以将它们联系在一起以获得所需的结果。这甚至可能吗?

1 个答案:

答案 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