3

对于给定的时间跨度,例如 2013-01-01 08:00 和 2013-01-02 08:00(24 小时),随着时间的推移,某人可能已按顺序输入记录以表明它们可用或不可用。如果新输入的记录的时间跨度重叠,则只允许使用不同的类型(可用或不可用)。发生更改时会保留可用性记录。

如何确定给定的时间跨度是否完全可用?

例如,我可能有以下记录:

RecId | Start DateTime   | End DateTime     | Type
=====================================================
1     | 2013-01-01 08:00 | 2013-01-02 08:00 | Available
2     | 2013-01-01 08:00 | 2013-01-02 08:00 | Unavailable
3     | 2013-01-01 17:00 | 2013-01-02 08:00 | Available
4     | 2013-01-01 08:00 | 2013-01-02 17:00 | Available
5     | 2013-01-01 12:00 | 2013-01-02 14:00 | Unavailable

鉴于上述记录,此人目前在 2013 年 1 月 1 日 08:00 至 12:00 和 14:00 至次日凌晨 0800 有空。

我现在想检查个人是否在 2013-01-01 11:00 到 2013-01-01 15:00 之间有空。答案应该是否定的,因为记录表明该人在该日期的 12:00 至 14:00 之间没有时间。

如果有帮助,该应用程序将查看某人是否有资格与另一名员工交换全部或部分预定轮班。可以与其他人进行轮班不同部分的多次交易。有人可以将他们的整个轮班换掉,然后为其他人工作该轮班的一部分,只要部分不重叠。当安排新交易时,我们需要能够检查员工实际上是否可以在请求的时间段内自由交易。

4

4 回答 4

2

您可以使用.NET 的时间段库来计算重叠和相交的时间段。

于 2013-04-23T15:08:36.853 回答
1

如果我理解您的问题,则完全可用 =连续可用,即没有干预的不可用记录槽。换句话说,某人在某个日期上午 9 点到下午 5 点有空,但也有记录说在同一天从下午 2 点到下午 4 点不可用,则该日期从上午 9 点到下午 5 点不可用。

因此,要确定某人是否可用于给定的所需跨度,您检查是否没有不可用的跨度在该所需跨度内开始或结束,并检查可用跨度是否在该所需跨度开始或与之同时开始之前开始,并在所需跨度结束时或在所需跨度结束后结束。

PS您还必须确保所需的跨度不属于不可用的跨度。

PPS 复杂性——或缺乏简单性——是由您使用可以重叠的可用性和不可用性的开始和结束范围造成的;另一种方法是创建代表一天中的时间段的实体(也许最小的是一刻钟),并且对于每个人的每个时间段,您都知道该人是否有空。然后您可以查询数据库并要求给定插槽范围内的每个插槽的状态 = AVAILABLE。

于 2013-04-19T19:30:15.267 回答
0

您似乎正在记录三种状态(可用、不可用和未定义),而只需要两种状态(可用或不可用)。

如果您将某个人设为不可用的默认状态(因为他们大部分时间都不在工作),那么您需要维护的只是可用时间段。这使得检查插槽是否空闲变得微不足道。

如果一个插槽是空闲的,那么您只需在交易后该插槽中的任何一个仍然空闲的情况下创建新的可用时段。

于 2013-04-19T20:08:33.277 回答
0

将记录的条目抽象为具有以下结构的对象列表: class AvailableSlot { public DateTime start; public DateTime end; }

现在您可以使用 LINQ 来解决您的问题:

        var availableSlots = new List<AvailableSlot>();
        //Read the record file and populate availableSlots
        DateTime inputStart = DateTime.Now; 
        DateTime inputEnd = DateTime.Now.AddHours(2);
        var isAvailable = availableSlots.Any(a => a.start <= inputStart && a.end >= inputEnd);
于 2013-04-19T19:31:10.917 回答