117

2つの日付値があります。1つはすでにデータベースに保存されており、もう1つはユーザーがDatePickerを使用して選択したものです。ユースケースは、データベースから特定の日付を検索することです。

以前にデータベースに入力された値の時間コンポーネントは常に12:00:00ですが、ピッカーから入力された日付の時間コンポーネントは異なります。

日付の要素のみに関心があり、時間の要素は無視したいと思います。

C#でこの比較を行う方法は何ですか?

また、LINQでこれを行う方法は?

更新:LINQ to Entitiesでは、以下が正常に機能します。

e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
4

14 に答える 14

136

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/

アップデート

EF 6.0以降では、EntityFunctionsはDbFunctionsに置き換えられています

于 2012-03-09T23:20:31.663 に答える
123

注:この回答を書いている時点では、EFの関係は不明確でした(これが書かれた後に質問に編集されました)。EFでの正しいアプローチについては、Mandeepsの回答を確認してください。


このDateTime.Dateプロパティを使用して、日付のみの比較を実行できます。

DateTime a = GetFirstDate();
DateTime b = GetSecondDate();

if (a.Date.Equals(b.Date))
{
    // the dates are equal
}
于 2009-09-25T16:10:09.380 に答える
25

これはあなたを助けることができると思います。

EFデータで満たされたリポジトリの日付を比較する必要があるため、拡張を行いました。LinqToEntities変換に実装されていないため、.Dateはオプションではありませんでした。

コードは次のとおりです。

        /// <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);
于 2009-11-18T23:59:18.883 に答える
11

DateDBエンティティのプロパティを使用すると、例外が発生します。

"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;
于 2012-07-26T08:48:30.140 に答える
9

LINQ to Entitiesでそれを行うには、サポートされているメソッドを使用する必要があります。

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

醜いですが、それは機能し、DBサーバー上で実行されます。

于 2009-09-30T16:46:30.780 に答える
8

これを行う別の方法がありますが、SecondDateが渡す変数である場合にのみ役立ちます。

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

私はそれがうまくいくはずだと思います

于 2011-07-01T17:12:05.137 に答える
7

これを使用することもできます:

DbFunctions.DiffDays(date1, date2) == 0

于 2015-12-17T16:46:00.487 に答える
5

これには、DbFunctions.TruncateTime()メソッドを使用できます。

e => DbFunctions.TruncateTime(e.FirstDate.Value) == DbFunctions.TruncateTime(SecondDate);
于 2016-11-11T06:26:31.853 に答える
3

完全な日時ではなく、常にDateTimeのDateプロパティを比較してください。

LINQクエリを作成するときは、クエリでdate.Dateを使用します。

var results = from c in collection
              where c.Date == myDateTime.Date
              select c;
于 2009-09-25T16:10:19.983 に答える
3

これが私がこれを行う方法です。

DateTime date_time_to_compare = DateTime.Now;
//Compare only date parts
context.YourObject.FirstOrDefault(r =>
                EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare));
于 2014-02-17T09:25:38.563 に答える
2

//Linqユーザー/コーダーへの注意

これにより、ユーザーからの入力を操作するときに日付が範囲内にあるかどうかを確認するための正確な比較が得られます。たとえば、日付ピッカーは次のようになります。

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

ここで、startdateとenddateは、日付ピッカーからの値です。

于 2011-08-04T16:01:21.393 に答える
1

このように試してみるよりも時間がない:

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;
于 2012-02-18T06:55:24.393 に答える
1

以下のリンクを使用して、時間なしで2つの日付を比較できます。

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つの異なる値を返します。-10 1は、dt1> dt2、dt1 = dt2、dt1を意味します。

于 2012-04-18T09:36:03.500 に答える
0

これを試してください...2つのDateTimesタイプ間でDateプロパティを比較することは問題なく機能します。

PS。これは一時的な解決策であり、非常に悪い習慣です。データベースが数千のレコードをもたらす可能性があることがわかっている場合は、絶対に使用しないでください...

query = query.ToList()
             .Where(x => x.FirstDate.Date == SecondDate.Date)
             .AsQueryable();
于 2012-02-06T16:58:43.900 に答える