对于给定的时间跨度,例如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-01-01从08:00至12:00,以及次日早晨14:00至0800可用。
我现在想检查个人是否可以从2013-01-01 11:00到2013-01-01 15:00获得。答案应该是否定的,因为记录表明个人在该日期的12:00至14:00不可用。
如果有帮助,应用程序将查看某人是否有资格与其他员工交换全部或部分预定班次。可以与其他个人进行轮班的不同部分的多次交易。有人可以交换他们的整个班次,然后为其他人工作部分班次,只要部分不重叠。我们需要能够在安排新交易时检查员工实际上可以自由交易所需的时间段。
答案 0 :(得分:2)
您可以使用Time Period Library for .NET计算重叠和相交的时间段。
答案 1 :(得分:1)
如果我理解你的问题,可以完全使用= 连续,即没有中间不可用的记录位。换句话说,在某个日期的某个时间为下午9点至下午5点但有人在同一天下午2点至下午4点有记录说不可用的人在当天上午9点到下午5点不可用。
因此,要确定是否有人可以获得给定的期望跨度,请检查是否在该期望跨度内没有可用的跨度开始或结束,并检查可用跨度是否在所需跨度开始之前开始或同时为使用它,并在所需跨度结束时或在所需跨度结束后结束。
P.S。您还必须确保所需的跨度不在不可用的范围内。
P.P.S。复杂性 - 或缺乏简单性 - 是通过使用可重叠的可用性和不可用性的开始和结束跨度来创建的;另一种方法是创建代表当天时间段的实体(可能最小的是四分之一小时),并且对于每个人,您知道该人是否可用于该插槽。然后,您可以查询数据库并要求给定插槽范围内的EACH插槽具有status = AVAILABLE。
答案 2 :(得分: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);
答案 3 :(得分:0)
当只需要两个状态(可用或不可用)时,您似乎记录了三种状态(可用,不可用和未定义)。
如果您设置一个人不可用的默认状态(因为他们大多数时间都不在工作),那么您需要维护的只是可用时段。这使得检查插槽是否空闲变得微不足道。
如果广告位是免费的,那么只需在交易后任何一个广告位仍然免费的情况下创建新的可用期限。