C# 使用linq检查数据库中的日期范围
我有广告牌容量的DB表。例如,该表包含公告牌id,从日期容量到日期结束(id=1,从日期4.11.17到日期19.11.17)。在该表中,该公告牌id有几行(21.11.17-5.12.2017,20.12.2017-20.12.2017)。我想做一些查询检查,看看这个广告牌是否在两个日期之间可用,我没有得到正确的结果。例如,我正在检查日期,如3.11.17-3.12.17或6.11.17-21.11.17。我需要的结果是,如果广告牌在我查询的确切日期可用。有什么想法吗C# 使用linq检查数据库中的日期范围,c#,linq,datetime,operators,C#,Linq,Datetime,Operators,我有广告牌容量的DB表。例如,该表包含公告牌id,从日期容量到日期结束(id=1,从日期4.11.17到日期19.11.17)。在该表中,该公告牌id有几行(21.11.17-5.12.2017,20.12.2017-20.12.2017)。我想做一些查询检查,看看这个广告牌是否在两个日期之间可用,我没有得到正确的结果。例如,我正在检查日期,如3.11.17-3.12.17或6.11.17-21.11.17。我需要的结果是,如果广告牌在我查询的确切日期可用。有什么想法吗 public stati
public static int CheckisMediaAvailable(cDataClassesDataContext db,
long bId, DateTime fromdate_date, DateTime todate_date)
{
return (from check in db.BillboardCapacities
where check.BillboardID == bId
&& check.AssociateGuid == UserAccountManager.AssociateGuid
&& Convert.ToDateTime(check.FromDate).Date >= fromdate_date
&& Convert.ToDateTime(check.ToDate).Date <= todate_date
select check).Count();
}
public static int CheckisMediaAvailable(CDATA类数据上下文数据库,
长出价,日期时间从日期到日期,日期时间到日期)
{
返回(来自签入db.BillboardCapacity
其中check.BillboardID==出价
&&check.AssociateGuid==UserAccountManager.AssociateGuid
&&转换.ToDateTime(检查.FromDate).Date>=FromDate\u日期
&&Convert.ToDateTime(check.ToDate).Date将您的=
转过来?如果您想检查广告牌是否在fromdate\u Date可用,则存储的数据应该更早,并且ToDate应该大于您作为ToDate检查的日期:
*****************************************************
####################### -> ok
**************
#################### -> not ok
**********************************
############################## -> not ok
如果要检查两个范围日期是否在任何点重叠,则需要检查两种情况:
- 案例1:
FromDate
在FromDate\u date
到toddate\u date
的范围内
- Case2:日期
ToDate
在fromtate\u date
到ToDate\u date
的范围内
如果这些条件中的任何一个为真,则存在重叠
在案例之前,证明如果两个条件都不满足,则不存在重叠。使用Patrick Artner的图表:
fromdate_date f***********t todate_date
FromDate F#########T ToDate F#########T
看看这里,无论是FromDate
,还是ToDate
,都不在FromDate\u-date
和ToDate\u-date
之间
f***********t
F#########T
F#####T
f***********t
F#########T
F#####T
案例1
无论广告牌是在todate\u日期之前完成,还是在fromdate\u日期之后完成,只要它是在fromdate\u日期之后(或在todate\u日期之前)开始的,都没有关系
f***********t
F#########T
F#####T
f***********t
F#########T
F#####T
您可以感觉到FromDate
被困在FromDate\u date
和todate\u date
中,因此它必须与它们重叠
案例2
无论广告牌是在<代码>开始日期
之前开始,还是在<代码>开始日期
之后开始,只要广告牌是在<代码>开始日期
之后(或在<代码>开始日期
之前结束,都没有关系
f***********t
F#########T
F#####T
f***********t
F#########T
F#####T
类似地,您可以感觉到ToDate
被困在fromdate\u date
和ToDate\u date
中,因此它必须与它们重叠
因此,关于日期的条件必须如下所示:
...
&& ((FromDate >= fromdate_date && FromDate <= todate_date)
|| ToDate >= fromdate_date && ToDate <= todate_date))
select ...
。。。
&&((FromDate>=FromDate\u date&&FromDate=FromDate\u date&&ToDate此示例的可能副本工作不正常。我有一行日期在2017年11月5日至2017年11月19日之间,如果我进行一些查询,如检查公告牌是否在2017年11月4日至2017年11月29日期间可用,则此代码响应公告牌可用(不可用)帮自己一个大忙,将日期作为日期(time)存储在数据库中。