Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq检查数据库中的日期范围_C#_Linq_Datetime_Operators - Fatal编程技术网

C# 使用linq检查数据库中的日期范围

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

我有广告牌容量的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 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)存储在数据库中。