使用可用时间和不可用时间的历史记录查找一段时间内的可用时间
本文关键字:时间 查找 一段时间 记录 历史 | 更新日期: 2023-09-27 18:10:00
对于给定的时间范围,例如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之间没空。
如果有帮助的话,该应用程序将查看某人是否有资格与另一名员工进行全部或部分排班交易。轮班的不同部分可以与其他个人进行多次交易。有些人可能会放弃整个班次,然后为其他人工作部分班次,只要部分不重叠。当安排新的交易时,我们需要能够检查员工是否确实可以在请求的时间段内自由交易。
您可以使用。net的时间段库来计算重叠和相交的时间段。
如果我理解你的问题,完全可用= 连续可用,即没有中间不可用的记录槽。换句话说,某人在某一天上午9点到下午5点有空,但他也有记录说同一天下午2点到4点不可用,在那天上午9点到下午5点不可用。
因此,要找出某人是否在给定的期望跨度内可用,您要检查是否没有不可用的跨度在期望跨度内开始或结束,并检查可用的跨度是否在期望跨度开始或与其同步之前开始,并在期望跨度结束时结束或在期望跨度结束后结束。
注:您还必须确保所需的范围不在Unavailable范围内。
P.P.S.复杂性(或缺乏简单性)是由您使用可用性和不可用性的开始和结束范围造成的,这些范围可能重叠;另一种方法是创建代表一天中的时间段的实体(可能最小的是25小时),并且对于每个时间段,您知道该人是否在该时间段可用。然后,您可以查询数据库并要求给定槽位范围内的每个槽位具有status= AVAILABLE。
将记录的条目抽象成一个对象列表,其结构如下: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);
您似乎记录了三种状态(可用、不可用和未定义),而实际上只需要两种状态(可用或不可用)。
如果您设置了一个人不可用的默认状态(因为他们大部分时间都不在工作),那么您所需要维护的就是可用性的时间段。这使得检查插槽是否空闲变得很简单。
如果一个槽位是空闲的,那么如果交易后该槽位仍然是空闲的,则只需创建新的可用期。