假设我有以下名为 Timing 的表格:
显然,每一行代表特定日期的班次。
一天可以有多个不重叠的班次。
如果一个班次跨越到下一天,它将在午夜被分割,第二部分将具有第一部分的父ID(如第24和31行所示)。
我想查询距离我的一天结束还有多少分钟(下一个关闭时间)。
例如,如果我在第1天,我的一天在第2天凌晨2:00结束(因为班次从第1天9:00开始,到第2天2:00结束)。
如果有间隔(例如周末等),我必须小心。请注意,没有第3天,因此下一个关闭时间将是第4天23:15(假设您在第3天)。
我主要寻找Linq查询(Timing.Where(x => x.close_time <....等等)。
但我认为这可能非常复杂,所以我可以使用原始SQL查询。
编辑: 这是我到目前为止得到的:
一天可以有多个不重叠的班次。
如果一个班次跨越到下一天,它将在午夜被分割,第二部分将具有第一部分的父ID(如第24和31行所示)。
我想查询距离我的一天结束还有多少分钟(下一个关闭时间)。
例如,如果我在第1天,我的一天在第2天凌晨2:00结束(因为班次从第1天9:00开始,到第2天2:00结束)。
如果有间隔(例如周末等),我必须小心。请注意,没有第3天,因此下一个关闭时间将是第4天23:15(假设您在第3天)。
我主要寻找Linq查询(Timing.Where(x => x.close_time <....等等)。
但我认为这可能非常复杂,所以我可以使用原始SQL查询。
编辑: 这是我到目前为止得到的:
var localTime = DateTime.Now;
var tomorrowDay = ((int)localTime.DayOfWeek + 7 + 1) % 7;
Timing lastShift = Timings.Where(x =>
((int)x.DayOfWeek) == tomorrowDay && x.ParentId != null)
.SingleOrDefault(); // Either it is tomorrow but starts today.
if (lastShift != null)
{
return Convert.ToInt32((lastShift.CloseTime - localTime.TimeOfDay).TotalMinutes);
}
lastShift = Timings
.Where(x => x.DayOfWeek == localTime.DayOfWeek && x.CloseTime >= localTime.TimeOfDay)
.OrderByDescending(x => x.CloseTime)
.Take(1).SingleOrDefault();
return Convert.ToInt32((lastShift.CloseTime - localTime.TimeOfDay).TotalMinutes);
编辑:
感谢@Han,以下是与上表相同的列表:
var Timings = new []
{
new Timing(22, (DayOfWeek)0, new TimeSpan(9,45,0), new TimeSpan(11, 15, 0),null),
new Timing(23, (DayOfWeek)0, new TimeSpan(13, 0, 0), new TimeSpan( 15, 0, 0), null),
new Timing(24, (DayOfWeek)1, new TimeSpan( 9, 0, 0), new TimeSpan(23, 59, 59), null),
new Timing(31, (DayOfWeek)2, new TimeSpan( 0, 0, 0), new TimeSpan( 2, 0, 0), 24),
new Timing(25, (DayOfWeek)2, new TimeSpan(10, 0, 0), new TimeSpan(12, 0, 0), null),
new Timing(26, (DayOfWeek)2, new TimeSpan(15, 0, 0), new TimeSpan(17, 0, 0), null),
new Timing(28, (DayOfWeek)4, new TimeSpan( 9, 45, 0), new TimeSpan(23, 15, 0), null),
new Timing(29, (DayOfWeek)5, new TimeSpan( 9, 45, 0), new TimeSpan(23, 15, 0), null),
new Timing(30, (DayOfWeek)6, new TimeSpan( 9, 45, 0), new TimeSpan(23, 15, 0), null),
};
class Timing
{
public int Id {get; set;}
public DayOfWeek DayOfWeek {get; set;}
public TimeSpan OpenTime {get; set;}
public TimeSpan CloseTime {get; set;}
public int? ParentId {get; set;}
public Timing(int id, DayOfWeek dow, TimeSpan openTime, TimeSpan closeTime, int? parentId)
{
this.Id = id;
this.DayOfWeek = dow;
this.OpenTime = openTime;
this.CloseTime = closeTime;
this.ParentId = parentId;
}
}