Yalnızca Entq Framework ile Linq to SQL DateTime türlerinde Zamansız Tarih karşılaştırmak nasıl?


304

İki DateTimedeğişkeni karşılaştırmak Linq2Sqlama Time bölümünü dikkate almamak için bir yol var mı .

Uygulama, öğeleri DB'de saklar ve yayınlanma tarihini ekler. Tam zamanı tutmak istiyorum ama yine de tarihin kendisini çekebiliyorum.

Karşılaştırmak 12/3/89 12:43:34ve 12/3/89 11:22:12günün gerçek zamanını göz ardı etmek istiyorum, böylece her ikisi de aynı kabul edilir.

Sanırım 00:00:00karşılaştırmadan önce günün her saatini ayarlayabilirim ama aslında günün saatini bilmek istiyorum, sadece tarihle de karşılaştırmak istiyorum.

Aynı soruna sahip bazı kodlar buldum ve yıl, ay ve günü ayrı olarak karşılaştırıyorlar. Bunu yapmanın daha iyi bir yolu var mı?

Yanıtlar:


535

Nesne Dateüzerindeki özelliği kullanmayı deneyin DateTime...

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

25
2017'nin başından sonra bir süre burada bitirirseniz, Alejandro tarafından aşağıdaki yanıtı ve wasatchWizard'ın yorumunu kontrol ettiğim gibi Entity Framework ortamında tarihleri ​​karşılaştırmanın bir yolunu arıyor.
Mike Devenney

8
2018'in ortasından bir süre sonra, yukarıdaki gibi son derece yararlı bir yorum okumak için bir yol arıyorsanız, şansınız kalmadı.
nardnob

4
2019'un başlarında komik bir rahatlama aradıktan sonra bir süre burada kalırsanız, onu buldunuz.
Phil Ringsmuth

1
Bu kesinlikle doğru cevap DEĞİLDİR. OP özellikle linq to SQL ve datetime.date adlı linq ifadelerinde izin verilmez.
Philip Vaughn

2
Eğer 2020 başlarından bir süre sonra buraya gelirseniz, umarım kendinize dikkat edersiniz ve koronavirüs pandemik krizleri sırasında evde kalırsınız. 2021'de buraya geri dön!
Bay Ott

61

Gerçek bir karşılaştırma için şunları kullanabilirsiniz:

dateTime1.Date.CompareTo(dateTime2.Date);

18
"Gerçek karşılaştırma" ile tam olarak ne demek istiyorsun?
Randolpho

6
Randolpho: == kullanmak size eşitlik verecektir, böylece iki tarih aynı mı yoksa farklı mı olsun. Karşılaştırma bunları karşılaştırmak için, örneğin: tarih1> tarih2, tarih1 <tarih2 veya tarih1 == tarih2 olup olmadığını anlamanız için size bir yol verin.
Reed Copsey

6
@ReedCopsey (dateTime1.Date <dateTime1.Date) işlevini kullanamaz mısınız?
David

14
Ama kim istiyor -1, 0ve 1gerçekten? Onlar sadece "daha az", "eşit" ve "daha büyük" ifadeleri temsil eden büyülü sayılardır. Ve ortaya çıkan tamsayıyı daha sonra bir şeyle "karşılaştırmanız" gerekir, çünkü üç olası değer vardır. Bunun daha doğal kullanmak olduğunu @ David ile kabul etmelidir dateTime1.Date < dateTime1.Dateve benzer olan <=, >ve >=çoğu uygulamada,.
Jeppe Stig Nielsen

8
@JeppeStigNielsen Bunu bir komaprison türünde veya alırken kullanırsanız, o zaman istersiniz - aksi takdirde genellikle operatörleri istersiniz.
Reed Copsey

45

LINQ ile çalışmak için bunu böyle yapıyorum.

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

Yalnızca dtOne.Date == dtTwo.DateLINQ ile çalışmazsa (Hata: Belirtilen tür üyesi 'Tarih' LINQ to Entities'de desteklenmez)


22
Bu, LINQ to Entities ile harika çalışır. Ancak, EntityFunctions.NET 4.5.2'de kullanımdan kaldırılmıştır. Bunu kullan: DbFunctions.TruncateTime. Aynı yöntem, sadece taşındı gibi görünüyor ..
wasatchwizard

25

Entity Framework <v6.0 EntityFunctions.TruncateTime kullanıyorsanız, Entity Framework> = v6.0 kullanıyorsanız,DbFunctions.TruncateTime

DateTimeLinq sorgunuzda kullanmak istediğiniz herhangi bir sınıf özelliğinin çevresinde (EF sürümünüze göre) birini kullanın

Misal

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

Burada sadece bir hatırlatma: Linq to Entity olduğu sürece.
curiousBoy

Bu doğru cevap olmalı (2019 itibariyle). EntityFunctions amortismana tabi tutulur ve datetime.date komutunu lambda ifadesinde kullanmanıza izin verilmez (herhangi bir nedenle - ciddiyim ... neden bunu düzeltmediler ?!).
Philip Vaughn

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 olabilecek DateField'ler kullanıyorsanız bunu kullanabilirsiniz.


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);

Fark değeri, yaş için gün sayısını temsil eder. Değer negatifse, başlangıç ​​tarihi bitiş tarihinden sonra düşer. Bu iyi bir çek.


1

Sen kullanabilirsiniz Eşittir veya CompareTo .

Eşittir : İki DateTime örneğinin aynı tarih ve saat değerine sahip olup olmadığını gösteren bir değer döndürür .

Dönüş Değerine Karşılaştır :

  1. Sıfırdan küçük : Bu örnek değerden önce ise.
  2. Sıfır : Bu örnek değerle aynıysa.
  3. Sıfırdan büyük : Bu örnek değerden sonra ise.

DateTime geçersizdir:

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");
}

veya

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 geçersiz sayılamaz:

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");
}

veya

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

Birleştirme veya nerede yan tümcesinde, Datesütunun özelliğini kullanın . Sahne arkasında bu bir CONVERT(DATE, <expression>)işlem yürütür . Bu, tarihleri ​​zaman olmadan karşılaştırmanıza izin vermelidir.


0

Deneyebilirsin

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: Neden DateTime'a ayrıştırıp @Quintin Robinson'ın yöntemini kullanmıyorsunuz? Bu Daily WTF görmeyi beklediğiniz koddur.
William Hurst

Bu kadar kolay bir görevin yanıt süresini artırdığı için bu kadar değişken yaratmaya gerek yoktur.
Nayan Katkani
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.