使用linq检查db中的日期范围

时间:2017-11-04 08:10:34

标签: c# linq datetime operators

我有广告牌容量的DB表。例如,该表包含广告牌ID,从日期容量到日期结束(id = 1,fromdate 4.11.17 todate 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 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();
}

2 个答案:

答案 0 :(得分:0)

<=>=转过来?如果你想检查来自fromdate_date的广告牌是否可用,那么存储的数据应该更早,并且todate应该大于你检查日期的日期:

*****************************************************
   #######################     -> ok

              **************
   ####################        -> not ok

**********************************
           ############################## -> not ok

答案 1 :(得分:0)

如果要检查2个范围日期是否在任何点重叠,则需要检查2个案例:

  • 案例1 FromDate位于从fromdate_datetodate_date的范围内;和,
  • 案例2 ToDate位于fromdate_datetodate_date的范围内。

如果这些条件中的任何一个为真,那么就会有重叠。

在案件之前,证明如果条件都不满足,那么没有重叠。使用Patrick Artner的图表:

                       fromdate_date f***********t todate_date
FromDate F#########T ToDate                                    F#########T
  

了解FromDate&{39}和ToDate&#fromdate_datetodate_date之间的关系。

<强>案例1

如果广告牌在todate_date之前或之后完成,只要它在fromdate_date之后(或之前)和{{1}之前(或之前)开始,这并不重要}}

todate_date
  

您可以认为 f***********t F#########T F#####T 被困在FromDatefromdate_date内,因此它必须与它们重叠。

<强>情况2

如果广告牌在todate_date之前或之后开始,只要它在fromdate_date之后(或之前)和{{1}之前(或之前)完成,这并不重要}}

fromdate_date
  

类似地,您可以感觉todate_date被困在 f***********t F#########T F#####T ToDate内,因此它必须与它们重叠。

因此,您对日期的条件必须如下:

fromdate_date