从开始和结束时间字段中导出两个小时的时间块

时间:2015-05-10 21:04:21

标签: ms-access pivot-table

我在Microsoft Access中有一个表,其中包含一个事件志愿者列表。该表包含姓名,电话号码等字段。还有三个字段;分配,描述志愿者将分配给哪些活动。例如,停车场,前门,售票亭等。另外两个领域,开始和结束时间描述志愿者何时能够工作。

是否可以编写一个查询 - 可能是某种数据透视表 - 如果时间段已填入作业,则有2小时的时间段作为行标题和某种真/假值?活动时间为早上6点至下午6点。

例如:

Assignment | 0600 | 0800 | 1000 | 1200 | 1400  | 1600 
Parking    |  X   |  o   |   X  |  X   |   X   |   X  
TicketBooth|  o   |  o   |   X  |  o   |   X   |   o  

我正在尝试按照他们的任务对志愿者进行分组,并从每个志愿者的开始和结束时间中获得两小时的时间段,并生成一份报告,以便活动协调员能够轻松区分是否需要添加志愿者分配。

志愿者表格结构如下:

FirstName | LastName | Assignment   | StartTime | EndTime
Joe       | Smith    | Parking      | 1000      | 1800
Jessica   | Anderson | Parking      | 0600      | 0800
Ryan      | Webber   | TicketBooth  | 1000      | 1200
Michael   | Flent    | TicketBooth  | 1400      | 1600

在给定表结构的情况下,是否可以生成查询以获取上面示例中显示的结果?如果没有,我需要修改什么?

2 个答案:

答案 0 :(得分:2)

我创建了一个时间块表,其中包含日期/时间字段的开头和结尾 每个街区。然后CROSS JOIN加上包含志愿者的表格。分配,并将其用作交叉表查询的数据源。

这是以下查询的结果集......

CrossTab query result set

注意:

  1. 我在预定的时间段中使用了一个数字(而不是" X")。如果您有多个志愿者同时安排同一个任务......无论是故意还是错误,这可能会很有用。
  2. 在我的分配表中, StartTime EndTime 都是日期/时间数据类型。如果你的是文本,这种一般方法仍然有效,但你必须调整查询。
  3. 这是查询...

    TRANSFORM Count(q.block_start) AS CountOfBlock_start
    SELECT q.Assignment
    FROM
        (
            SELECT a.Assignment, tb.block_start
            FROM assignments AS a, time_blocks AS tb
            WHERE
                    tb.block_start >= [a].[StartTime] 
                AND tb.block_end   <= [a].[EndTime]
        ) AS q
    GROUP BY q.Assignment
    PIVOT Format(q.block_start, 'hhnn')
        IN ('0600','0800','1000','1200','1400','1600');
    

    这是我的 time_blocks 表...

    block_start block_end
    ----------- -----------
     6:00:00 AM  8:00:00 AM
     8:00:00 AM 10:00:00 AM
    10:00:00 AM 12:00:00 PM
    12:00:00 PM  2:00:00 PM
     2:00:00 PM  4:00:00 PM
     4:00:00 PM  6:00:00 PM
    

答案 1 :(得分:1)

好的,所以考虑到你的样本数据,一个Pivot表并不理想,因为缺少一个表/连接表有时间,谁可以工作等等。

所以,我创建了一个返回"o""x"的函数,具体取决于某人的可用性是否符合您为我们提供示例的时间段。唯一不好的是你必须为每个时隙手动创建一个列。这对于Pivot表来说是件好事。

这也可以使用IIf()来完成。以下是一个简单的例子:

SELECT volunteers.Names,
       volunteers.Assignment, 
       IIf(1800>=[Start] And 1800<=[End],"Can Work","Can't") AS 1800
FROM volunteers;

无论如何,这里的功能(我没有处理任何错误):

Option Compare Database
Option Explicit

Public Function IsAvailable(time, starttime, endtime) As String

Dim AvailableTime, StartingTime, EndingTime As Integer

AvailableTime = time
StartingTime = starttime
EndingTime = endtime

If AvailableTime >= StartingTime And AvailableTime <= EndingTime Then
    IsAvailable = "o"
Else
    IsAvailable = "x"
End If

End Function

如何在查询中使用它:

SELECT volunteers.Names, 
       volunteers.Assignment, 
       IsAvailable(600,[Start],[End]) AS 0600, 
       IsAvailable(800,[Start],[End]) AS 0800, 
       IsAvailable(1000,[Start],[End]) AS 1000, 
       IsAvailable(1200,[Start],[End]) AS 1200, 
       IsAvailable(1400,[Start],[End]) AS 1400, 
       IsAvailable(1600,[Start],[End]) AS 1600, 
       IsAvailable(1800,[Start],[End]) AS 1800
FROM volunteers;

可视化:

enter image description here

注意:我在表格中使用了StartEnd作为我的列名,因此您必须分别更改[Start][End]

另外,我个人认为这不是最好的解决方案。我想如果你知道这些数据需要采用这种格式,我可能会为它设计我的数据库,但这是一种粗略的解决方法。