代码之家  ›  专栏  ›  技术社区  ›  pencilslate

如何只比较ef中datetime的日期组件?

  •  110
  • pencilslate  · 技术社区  · 15 年前

    我有两个日期值,一个已经存储在数据库中,另一个由用户使用日期选择器选择。用例是从数据库中搜索特定的日期。

    以前在数据库中输入的值的时间分量始终为12:00:00,因为从选取器输入的日期具有不同的时间分量。

    我只对日期组件感兴趣,希望忽略时间组件。

    在C中进行比较的方法是什么?

    另外,如何在LINQ中执行此操作?

    更新: 在Linq to实体上,以下工作正常。

    e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
    
    15 回复  |  直到 8 年前
        1
  •  119
  •   Community dbr    7 年前

    注: 在写这个答案的时候,ef关系不清楚(在写了这个之后被编辑到问题中)。如需正确使用EF,请检查 Mandeeps answer .


    你可以使用 DateTime.Date 属性以执行仅日期比较。

    DateTime a = GetFirstDate();
    DateTime b = GetSecondDate();
    
    if (a.Date.Equals(b.Date))
    {
        // the dates are equal
    }
    
        2
  •  126
  •   jmvtrinidad    8 年前

    使用课堂 EntityFunctions 用于缩短时间段。

    using System.Data.Objects;    
    
    var bla = (from log in context.Contacts
               where EntityFunctions.TruncateTime(log.ModifiedDate) ==  EntityFunctions.TruncateTime(today.Date)
               select log).FirstOrDefault();
    

    来源: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

    更新

    从EF6.0开始,更新的EntityFunctions将替换为 DbFunctions .

        3
  •  24
  •   jrojo    15 年前

    我想这对你有帮助。

    我做了一个扩展,因为我必须比较包含EF数据的存储库中的日期,所以日期不是一个选项,因为它不在LinqToEntities转换中实现。

    代码如下:

            /// <summary>
        /// Check if two dates are same
        /// </summary>
        /// <typeparam name="TElement">Type</typeparam>
        /// <param name="valueSelector">date field</param>
        /// <param name="value">date compared</param>
        /// <returns>bool</returns>
        public Expression<Func<TElement, bool>> IsSameDate<TElement>(Expression<Func<TElement, DateTime>> valueSelector, DateTime value)
        {
            ParameterExpression p = valueSelector.Parameters.Single();
    
            var antes = Expression.GreaterThanOrEqual(valueSelector.Body, Expression.Constant(value.Date, typeof(DateTime)));
    
            var despues = Expression.LessThan(valueSelector.Body, Expression.Constant(value.AddDays(1).Date, typeof(DateTime)));
    
            Expression body = Expression.And(antes, despues);
    
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }
    

    然后你可以这样使用它。

     var today = DateTime.Now;
     var todayPosts = from t in turnos.Where(IsSameDate<Turno>(t => t.MyDate, today))
                                          select t);
    
        4
  •  10
  •   algreat    12 年前

    如果您使用 Date 数据库实体的属性将出现异常:

    "The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."
    

    您可以使用如下内容:

      DateTime date = DateTime.Now.Date;
    
      var result = from client in context.clients
                   where client.BirthDate >= date
                         && client.BirthDate < date.AddDays(1)
                   select client;
    
        5
  •  8
  •   Craig Stuntz    15 年前

    要在Linq to实体中执行此操作,必须使用 supported methods :

    var year = someDate.Year;
    var month = ...
    var q = from r in Context.Records
            where Microsoft.VisualBasic.DateAndTime.Year(r.SomeDate) == year 
                  && // month and day
    

    很难看,但它可以工作,而且是在数据库服务器上完成的。

        6
  •  8
  •   John Kaster    13 年前

    这是一种不同的方法,但只有当secondate是您要传递的变量时,它才有用:

    DateTime startDate = SecondDate.Date;
    DateTime endDate = startDate.AddDays(1).AddTicks(-1);
    ...
    e => e.FirstDate.Value >= startDate && e.FirstDate.Value <= endDate
    

    我想应该行

        7
  •  6
  •   user3829854    9 年前

    您还可以使用:

    DbFunctions.DiffDays(date1, date2) == 0

        8
  •  3
  •   Reed Copsey    15 年前

    总是比较 Date 日期时间属性,而不是完整日期时间。

    当您进行LINQ查询时,请在查询中使用date.date,即:

    var results = from c in collection
                  where c.Date == myDateTime.Date
                  select c;
    
        9
  •  3
  •   Alejandro del Río Kristifor    10 年前

    我就是这样做的。

    DateTime date_time_to_compare = DateTime.Now;
    //Compare only date parts
    context.YourObject.FirstOrDefault(r =>
                    EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare));
    
        10
  •  3
  •   Harsh Vyas    8 年前

    您可以为此使用dbfunctions.truncateTime()方法。

    e => DbFunctions.TruncateTime(e.FirstDate.Value) == DbFunctions.TruncateTime(SecondDate);
    
        11
  •  2
  •   Braulio    13 年前
        12
  •  2
  •   Alberto Zaccagni    13 年前

    //LINQ用户/编码员注意事项

    当使用用户日期选择器的输入时,这将为您提供精确的比较,以检查日期是否在范围内,例如:

    ((DateTime)ri.RequestX.DateSatisfied).Date >= startdate.Date &&
            ((DateTime)ri.RequestX.DateSatisfied).Date <= enddate.Date
    

    其中startdate和enddate是日期选取器中的值。

        13
  •  1
  •   Dmitrii Lobanov    12 年前

    没有时间就这样尝试:

    TimeSpan ts = new TimeSpan(23, 59, 59);
    toDate = toDate.Add(ts);
    List<AuditLog> resultLogs = 
        _dbContext.AuditLogs
        .Where(al => al.Log_Date >= fromDate && al.Log_Date <= toDate)
        .ToList();
    return resultLogs;
    
        14
  •  1
  •   antyrat Andy    12 年前

    您可以使用下面的链接来比较两个没有时间的日期:

    private bool DateGreaterOrEqual(DateTime dt1, DateTime dt2)
            {
                return DateTime.Compare(dt1.Date, dt2.Date) >= 0;
            }
    
    private bool DateLessOrEqual(DateTime dt1, DateTime dt2)
            {
                return DateTime.Compare(dt1.Date, dt2.Date) <= 0;
            }
    

    compare函数返回3个不同的值:-1 0 1,这意味着DT1>DT2,DT1=DT2,DT1

        15
  •  0
  •   Raskunho    9 年前

    试试这个…比较两个日期时间类型之间的日期属性很好:

    这是一个权宜之计,也是一个非常糟糕的做法,当你知道数据库可以带来数千条记录时,千万不要使用它…

    query = query.ToList()
                 .Where(x => x.FirstDate.Date == SecondDate.Date)
                 .AsQueryable();