不确定如何最好地解释这一点,所以请耐心等待......
我正在编写一个应用程序来自动生成员工rota。
我有一张表(tl_RotaDays
),它基本上是一个日历,用于记录哪一位工作人员在特定日期正在通话 - 例如。
Date Login
---------------------------
02-01-2012 Bob
03-01-2012 Bob
04-01-2012 Bob
05-01-2012 Bob
06-01-2012 Bob
09-01-2012 Bob
10-01-2012 Bob
11-01-2012 Bob
12-01-2012 Sue
13-01-2012 Sue
我希望在每个人工作的最后一个“完整”工作周(周一至周五)返回星期五的日期,基于“完整”周被定义为他们工作的一周> = 3天。
在上面的例子中,“Bob”的查询应该返回“13-01-2012”,因为他在那个星期的大部分时间工作,即使Sue工作在本周末。
我有一个查询,它获取每个人工作的最后日期:
lastEveningOOH = Convert.ToDateTime((from rd in db.tl_rotaDays
where rd.ooh == tc.login && ((int)Convert.ToDateTime(rd.date).DayOfWeek >= 1 &&
(int)Convert.ToDateTime(rd.date).DayOfWeek <= 5)
select rd.date).Max()),
但是我能想到的唯一方法就是检查这个人是否工作了一个“完整”的一周就是查询每一行的原始表格,这看起来非常低效。
答案 0 :(得分:1)
如果dt是日期列表,您可以在一个Linq-Query中执行此操作:
DateTime maxWeek =
dt.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday).GroupBy(
d => new GregorianCalendar().GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)).Where(
g => g.Count() > 2).OrderBy(g => g.Key).Last().Max();
如果目的是优化SQL查询,您可以检查Linq2Sql在这里生成什么,看看是否不是一个简单的算法方法(查看最大日期=&gt;检查是否完整周=&gt;查看最大日期 - 7等。 )效果最好。 如果日期跨越多年,上述Linq查询也可能不正确,但可以修改分组以纠正该问题。