C# DateTime之间的时间跨度仅在营业时间上午8:30-下午5:00 M-F
我试图获得从工作登录到票务系统到工作到期之间的总时间(以小时为单位)。例如,如果作业在星期五下午4:00记录,并在星期一上午10:30到期,则其时间跨度为3小时。(不包括周末和我们的营业时间) 我可以获取总时间的C# DateTime之间的时间跨度仅在营业时间上午8:30-下午5:00 M-F,c#,linq,C#,Linq,我试图获得从工作登录到票务系统到工作到期之间的总时间(以小时为单位)。例如,如果作业在星期五下午4:00记录,并在星期一上午10:30到期,则其时间跨度为3小时。(不包括周末和我们的营业时间) 我可以获取总时间的TimeSpan,但我不知道如何仅在工作时间获取TimeSpan 我使用LINQpad作为代码草稿行,并查询数据库 下面是我的一个查询示例,它获取的是总的TimeSpan,而不是工作时间的TimeSpan (from so in TblServiceOrders where so.D
TimeSpan
,但我不知道如何仅在工作时间获取TimeSpan
我使用LINQpad
作为代码草稿行,并查询数据库
下面是我的一个查询示例,它获取的是总的TimeSpan
,而不是工作时间的TimeSpan
(from so in TblServiceOrders
where so.DateReceived != null
&& so.TimeReceived != null
&& so.DateRequested != null
&& so.TimeRequested != null
orderby so.SONumber descending
select new
{
so.SONumber,
received = so.DateReceived.Value.AddTicks(so.TimeReceived.Value.Ticks),
requested = so.DateRequested.Value.AddTicks(so.TimeRequested.Value.Ticks),
TimeSpan = (so.DateReceived.Value.AddTicks(so.TimeReceived.Value.Ticks))
.Subtract(so.DateRequested.Value.AddTicks(so.TimeRequested.Value.Ticks))
}).Take(20)
我希望有更好的方法来做到这一点,但是因为我的
时间范围从来都不超过几天,我已经能够在Linq
查询中使用以下代码实现这一切:
这只适用于linqtosql
,这很不幸,因为它不能在实体框架中使用
from so in TblServiceOrders
where so.DateReceived != null &&
so.TimeReceived != null &&
so.DateRequested != null &&
so.TimeRequested != null
//Get the named day of the week for start of TimeRange
let DayReceived = so.DateReceived.Value.DayOfWeek
let DayRequested = so.DateRequested.Value.DayOfWeek
//Find out how many days pass within the TimeRange
let SLADaysLapesed = ((so.DateRequested.Value.Day) - (so.DateReceived.Value.Day))
//Find out if any of those days past fall onto a Sat and therefor over a weekend.
//This will only work for the first weekend within the TimeRange.
let SLAContainsWE = (DayReceived == DayOfWeek.Monday && SLADaysLapesed <= 4 ||
DayReceived == DayOfWeek.Tuesday && SLADaysLapesed <= 3 ||
DayReceived == DayOfWeek.Wednesday && SLADaysLapesed <= 2 ||
DayReceived == DayOfWeek.Thursday && SLADaysLapesed <= 1 ||
DayReceived == DayOfWeek.Friday && SLADaysLapesed <= 0 ? false : true )
//Work out how many hours pass outside of business hours. (930 minutes)
let SLATotalDailyAH = (new TimeSpan(0, (930 * SLADaysLapesed), 0))
//Work out if the TimeRange falls over a weekend. Time declared in mins is equal to two standard working days 8.5hr x 2 in my case.
let TotalWEHours = (SLAContainsWE == true ? new TimeSpan(0,1020,0) : new TimeSpan(0,0,0))
//Work out how many Business hours have passed by removing the total after hours.
let SLAHours = (
((so.DateRequested.Value.AddHours(so.TimeRequested.Value.Hour)).AddMinutes(so.TimeRequested.Value.Minute)).Subtract
((so.DateReceived.Value.AddHours(so.TimeReceived.Value.Hour)).AddMinutes(so.TimeReceived.Value.Minute)).Subtract
(SLATotalDailyAH).Subtract(TotalWEHours)
)
select SLAHours
TblServiceOrders中so的
在哪里收到了这样的邮件!=空的&&
所以,我收到了空的&&
所以,我请求了!=空的&&
所以,请求时间!=无效的
//获取一周中指定的开始时间范围的日期
让DayReceived=so.DateReceived.Value.DayOfWeek
让DayRequested=so.DateRequested.Value.DayOfWeek
//了解时间范围内经过了多少天
让sladayslappesed=((so.DateRequested.Value.Day)-(so.DateReceived.Value.Day))
//找出过去的那些日子中是否有一天被列入Sat考试,并因此在周末被列入Sat考试。
//这只适用于时间范围内的第一个周末。
让我们=(DayReceived==DayOfWeek.Monday&&SladaySlapped为什么不计算一周的剩余时间并加上下一周的剩余时间?或者计算总时间并减去休息时间?嗨,杰夫,有些工作的优先级为3天,而有些工作的优先级为3小时。有些工作会在夜间终止,有些工作会在周末终止,而另一些工作会在周末终止在同一天内。我正在寻找一种合乎逻辑的方法来建立解释所有这些的条件,我只是在画空白(