Enqity Frameworkを使用したLinq to SQLのDateTime型で時間なしの日付のみを比較するにはどうすればよいですか?


303

で2つのDateTime変数を比較する方法はありますLinq2Sqlが、時間の部分は無視します。

アプリはDBにアイテムを保存し、公開日を追加します。正確な時刻を保持したいが、それでも日付自体を取得できるようにしたい。

私は比較したい12/3/89 12:43:3412/3/89 11:22:12し、これらの両方が同じと考えられているので、それはその日の実際の時間を無視しています。

00:00:00比較する前にすべての時刻を設定できると思いますが、実際には時刻だけを知りたいのですが、日付のみで比較できるようにしたいのです。

同じ問題のあるコードを見つけ、年、月、日を個別に比較しました。これを行うより良い方法はありますか?

回答:


534

オブジェクトのDateプロパティを使用してみてくださいDateTime...

if(dtOne.Date == dtTwo.Date)
    ....

25
2017年の初めの少し後に、Entity Framework環境で日付を比較する方法を探している場合は、Alejandroによる以下の回答とwasatchWizardによるコメントを確認してください。
Mike Devenney 2017

8
上記のような非常に役立つ別のコメントを読む方法を探して、2018年中頃の終わりにここに到着した場合、あなたは運が悪いです。
nardnob

4
2019年の初めからしばらくして、ここで漫画の救済を探していたら、きっと見つかります。
Phil Ringsmuth

1
これは絶対に正しい答えではありません。OPは、Linq to SQLおよびdatetime.dateはlinq式では許可されていないと明確に述べています。
フィリップヴォーン

2
2020年の初めからしばらくしてここに到着した場合は、コロナウイルスのパンデミック危機が発生している間、自分のことを大事にして家にいるようにしてください。2021年にここに戻ってください!
Mr. Ott

61

真の比較には、以下を使用できます。

dateTime1.Date.CompareTo(dateTime2.Date);

18
「真の比較」とはどういう意味ですか?
Randolpho

6
ランドルフォ:==を使用すると同等になるため、2つの日付が同じか異なるかが決まります。CompareToはそれらを〜比較〜します。つまり、1つのパスで、date1> date2、date1 <date2、またはdate1 == date2かどうかを判断する方法を提供します。
リードコプシー

6
@ReedCopsey(dateTime1.Date <dateTime1.Date)だけを使用できませんか?
David

14
しかし、誰が-10そして1本当に望んでいるか?これらは、「少ない」、「等しい」、「大きい」を表す単なる魔法の数字です。そして、3つの可能な値があるため、結果の整数を後で何かと「比較」する必要があります。@Davidに同意する必要があります。これは、ほとんどのアプリケーションdateTime1.Date < dateTime1.Date<=>およびと同様に使用する方がはるかに自然>=です。
Jeppe Stig Nielsen

8
@JeppeStigNielsen並べ替えまたは同情を取る何かでこれを使用している場合は、それが必要です。それ以外の場合は、通常は演算子のみが必要です。
リードコプシー2014年

45

これは、LINQで作業するためにこれを行う方法です。

DateTime date_time_to_compare = DateTime.Now;
//Compare only date parts
context.YourObject.FirstOrDefault(r =>
                EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare));

使用するだけの場合dtOne.Date == dtTwo.Date、LINQでは機能しません(エラー:指定された型メンバー 'Date'はLINQ to Entitiesではサポートされていません)


22
これは、LINQ to Entitiesでうまく機能します。ただし、EntityFunctions.NET 4.5.2では廃止されました。代わりにこれを使用してくださいDbFunctions.TruncateTime。同一の方法のようですが、移動しただけです
。– wasatchwizard

25

Entity Framework <v6.0を使用しているEntityFunctions.TruncateTime 場合は、Entity Framework> = v6.0を使用している場合は、DbFunctions.TruncateTime

DateTimeLinqクエリ内で使用するクラスプロパティの周りで(EFバージョンに基づいて)いずれかを使用します

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
                                       >= DbFunctions.TruncateTime(DateTime.UtcNow));

ここで覚えておくべきことは、Linq to Entityである限りです。
curiousBoy 2018年

これが正解です(2019年現在)。EntityFunctionsは減価償却されており、ラムダ式でdatetime.dateを使用することは許可されていません(なんらかの理由で-真剣に...なぜ彼らはこれを修正していないのですか?)。
フィリップヴォーン

12
DateTime dt1 = DateTime.Now.Date;
DateTime dt2 = Convert.ToDateTime(TextBox4.Text.Trim()).Date;
if (dt1 >= dt2)
{
    MessageBox.Show("Valid Date");
}
else
{
    MessageBox.Show("Invalid Date... Please Give Correct Date....");
}

9
DateTime? NextChoiceDate = new DateTime();
DateTIme? NextSwitchDate = new DateTime();
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date)
{
Console.WriteLine("Equal");
}

null可能なDateFieldsを使用している場合は、これを使用できます。


3
DateTime dt1=DateTime.ParseExact(date1,"dd-MM-yyyy",null);
DateTime dt2=DateTime.ParseExact(date2,"dd-MM-yyyy",null);

int cmp=dt1.CompareTo(dt2);

   if(cmp>0) {
       // date1 is greater means date1 is comes after date2
   } else if(cmp<0) {
       // date2 is greater means date1 is comes after date1
   } else {
       // date1 is same as date2
   }

2
DateTime econvertedDate = Convert.ToDateTime(end_date);
DateTime sconvertedDate = Convert.ToDateTime(start_date);

TimeSpan age = econvertedDate.Subtract(sconvertedDate);
Int32 diff = Convert.ToInt32(age.TotalDays);

diff値は、年齢の日数を表します。値が負の場合、開始日は終了日より後になります。これは良いチェックです。


1

EqualsまたはCompareToを使用できます。

Equals:2つのDateTimeインスタンスが同じ日付と時刻の値を持っているかどうかを示す値を返します。

CompareToの戻り値

  1. ゼロ未満:このインスタンスが値より前の場合。
  2. ゼロ:このインスタンスが値と同じ場合。
  3. ゼロより大きい:このインスタンスが値より遅い場合。

DateTimeはnull可能です:

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Value.Date.Equals(second.Value.Date))
{
    Console.WriteLine("Equal");
}

または

DateTime? first = new DateTime(1992,02,02,20,50,1);
DateTime? second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Value.Date.CompareTo(second.Value.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}

DateTimeはnullにできません:

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);

if (first.Date.Equals(second.Date))
{
    Console.WriteLine("Equal");
}

または

DateTime first = new DateTime(1992,02,02,20,50,1);
DateTime second = new DateTime(1992, 02, 02, 20, 50, 2);


var compare = first.Date.CompareTo(second.Date);

switch (compare)
{
    case 1:
        Console.WriteLine("this instance is later than value.");
        break;
    case 0:
        Console.WriteLine("this instance is the same as value.");
        break;
    default:
        Console.WriteLine("this instance is earlier than value.");
        break;
}

0

結合またはwhere句Dateで、列のプロパティを使用します。裏で、これはCONVERT(DATE, <expression>)操作を実行します。これにより、時間なしで日付を比較できます。


0

あなたが試すことができます

if(dtOne.Year == dtTwo.Year && dtOne.Month == dtTwo.Month && dtOne.Day == dtTwo.Day)
  ....

-16
        int o1 = date1.IndexOf("-");
        int o2 = date1.IndexOf("-",o1 + 1);
        string str11 = date1.Substring(0,o1);
        string str12 = date1.Substring(o1 + 1, o2 - o1 - 1);
        string str13 = date1.Substring(o2 + 1);

        int o21 = date2.IndexOf("-");
        int o22 = date2.IndexOf("-", o1 + 1);
        string str21 = date2.Substring(0, o1);
        string str22 = date2.Substring(o1 + 1, o2 - o1 - 1);
        string str23 = date2.Substring(o2 + 1);

        if (Convert.ToInt32(str11) > Convert.ToInt32(str21))
        {
        }
        else if (Convert.ToInt32(str12) > Convert.ToInt32(str22))
        {
        }
        else if (Convert.ToInt32(str12) == Convert.ToInt32(str22) && Convert.ToInt32(str13) > Convert.ToInt32(str23))
        {
        }

5
-1:DateTimeに解析して、@ Quintin Robinsonのメソッドを使用しないのはなぜですか?これは、The Daily WTFで見られるコードです。
William Hurst

これほど多くの変数を作成する必要はありません。このような簡単なタスクの応答時間が増えるためです。
Nayan Katkani
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.