Bagaimana membandingkan hanya Tanggal tanpa Waktu dalam jenis DateTime di Linq ke SQL dengan Entity Framework?

303

Apakah ada cara untuk membandingkan dua DateTimevariabel Linq2Sqltetapi untuk mengabaikan bagian Waktu.

Aplikasi menyimpan item dalam DB dan menambahkan tanggal yang dipublikasikan. Saya ingin menyimpan waktu yang tepat tetapi masih bisa menarik berdasarkan tanggal itu sendiri.

Saya ingin membandingkan 12/3/89 12:43:34dan 12/3/89 11:22:12membiarkannya mengabaikan waktu hari itu sehingga keduanya dianggap sama.

Saya kira saya dapat mengatur semua waktu sehari 00:00:00sebelum saya membandingkan tetapi saya sebenarnya ingin tahu waktu hari saya hanya ingin dapat membandingkan berdasarkan tanggal saja.

Saya menemukan beberapa kode yang memiliki masalah yang sama dan mereka membandingkan tahun, bulan, dan hari secara terpisah. Apakah ada cara yang lebih baik untuk melakukan ini?

Dengan sopan
sumber

Jawaban:

534

coba gunakan Dateproperti pada DateTimeObject ...

if(dtOne.Date == dtTwo.Date)
    ....
Quintin Robinson
sumber
25
Jika Anda berakhir di sini sekitar awal 2017 mencari cara untuk membandingkan tanggal di lingkungan Entity Framework seperti yang saya lakukan lihat jawaban di bawah ini oleh Alejandro dan komentar oleh wasatchWizard.
Mike Devenney
8
Jika Anda berakhir di sini sekitar pertengahan 2018 mencari cara untuk membaca komentar yang sangat bermanfaat seperti yang di atas, Anda kurang beruntung.
nardnob
4
Jika Anda berakhir di sini sekitar awal 2019 mencari bantuan komik, Anda telah menemukannya.
Phil Ringsmuth
1
Ini BUKAN jawaban yang benar. OP secara khusus mengatakan Linq ke SQL dan datetime.date TIDAK diperbolehkan dalam ekspresi LINQ.
Philip Vaughn
2
Jika Anda berakhir di sini sekitar awal 2020, saya harap Anda menjaga diri sendiri dan tinggal di rumah selama krisis pandemi coronavirus. Kembali ke sini pada tahun 2021!
Tn. Ott
61

Untuk perbandingan yang benar, Anda dapat menggunakan:

dateTime1.Date.CompareTo(dateTime2.Date);
Reed Copsey
sumber
18
Apa sebenarnya yang Anda maksud dengan "perbandingan sejati"?
Randolpho
6
Randolpho: Menggunakan == akan memberi Anda kesetaraan, jadi apakah kedua tanggal itu sama atau berbeda. CompareTo akan ~ bandingkan ~ mereka, yaitu: memberi Anda cara dalam satu pass untuk mengetahui apakah date1> date2, date1 <date2, atau date1 == date2.
Reed Copsey
6
@ReedCopsey Tidak bisakah Anda menggunakan (dateTime1.Date <dateTime1.Date)?
David
14
Tapi siapa yang mau -1, 0dan 1, sungguh? Mereka hanya angka ajaib yang mewakili "kurang", "sama" dan "lebih besar". Dan Anda harus "membandingkan" bilangan bulat yang dihasilkan dengan sesuatu setelahnya karena ada tiga nilai yang mungkin. Saya harus setuju dengan @David bahwa itu jauh lebih alami untuk digunakan dateTime1.Date < dateTime1.Date, dan juga dengan <=, >dan >=, di sebagian besar aplikasi.
Jeppe Stig Nielsen
8
@JeppeStigNielsen Jika Anda menggunakan ini dalam segala hal yang memerlukan atau mengambil comaprison, maka Anda menginginkannya - jika tidak, Anda biasanya hanya menginginkan operator.
Reed Copsey
45

Ini adalah bagaimana saya melakukan ini untuk bekerja dengan 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));

Jika Anda hanya menggunakannya, dtOne.Date == dtTwo.Dateia tidak akan berfungsi dengan LINQ (Galat: Anggota tipe tertentu 'Tanggal' tidak didukung di LINQ untuk Entitas)

Alejandro del Río
sumber
22
Ini berfungsi baik dengan LINQ untuk Entitas. Namun, EntityFunctionstelah usang dalam .NET 4.5.2. Gunakan ini sebagai gantinya: DbFunctions.TruncateTime. Tampaknya metode yang identik, baru saja pindah ..
wasatchwizard
25

Jika Anda menggunakan Entity Framework <v6.0, maka gunakan EntityFunctions.TruncateTime Jika Anda menggunakan Entity Framework> = v6.0, maka gunakanDbFunctions.TruncateTime

Gunakan salah satu (berdasarkan versi EF Anda) di sekitar DateTimeproperti kelas apa pun yang ingin Anda gunakan di dalam kueri Linq Anda

Contoh

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
                                       >= DbFunctions.TruncateTime(DateTime.UtcNow));
Korayem
sumber
Hanya pengingat di sini: Selama itu adalah Linq to Entity.
curiousBoy
Ini harus menjadi jawaban yang benar (pada 2019). EntityFunctions didepresiasi dan Anda tidak diizinkan menggunakan datetime.date dalam ekspresi lambda (untuk alasan apa pun - maksud saya serius ... mengapa mereka tidak memperbaikinya ?!).
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....");
}
Devarajan.T
sumber
9
DateTime? NextChoiceDate = new DateTime();
DateTIme? NextSwitchDate = new DateTime();
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date)
{
Console.WriteLine("Equal");
}

Anda dapat menggunakan ini jika Anda menggunakan DateFields yang dapat dibatalkan.

Kode Geek
sumber
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
   }
Mohan Sharma
sumber
2
DateTime econvertedDate = Convert.ToDateTime(end_date);
DateTime sconvertedDate = Convert.ToDateTime(start_date);

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

Nilai diff menunjukkan jumlah hari untuk usia. Jika nilainya negatif tanggal mulai turun setelah tanggal akhir. Ini cek yang bagus.

dgsjr
sumber
1

Anda dapat menggunakan Equals atau CompareTo .

Setara : Mengembalikan nilai yang menunjukkan apakah dua instance DateTime memiliki nilai tanggal dan waktu yang sama.

CompareTo Nilai Pengembalian :

  1. Kurang dari nol : Jika instance ini lebih awal dari nilai.
  2. Nol : Jika instance ini sama dengan nilai.
  3. Lebih besar dari nol : Jika instance ini lebih dari nilai.

DateTime tidak dapat dibatalkan:

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

atau

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 tidak dapat dibatalkan:

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

atau

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;
}
Reza Jenabi
sumber
0

Di gabung Anda atau di mana klausa, gunakan Dateproperti kolom. Di belakang layar, ini menjalankan CONVERT(DATE, <expression>)operasi. Ini akan memungkinkan Anda untuk membandingkan tanggal tanpa waktu.

Adam Robinson
sumber
0

Anda dapat mencoba

if(dtOne.Year == dtTwo.Year && dtOne.Month == dtTwo.Month && dtOne.Day == dtTwo.Day)
  ....
Cristian
sumber
-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))
        {
        }
Hetuk Upadhyay
sumber
5
-1: Mengapa tidak hanya menguraikan DateTime dan menggunakan metode @Quintin Robinson? Ini adalah kode yang saya harapkan untuk dilihat di The Daily WTF.
William Hurst
Tidak perlu membuat banyak variabel ini karena meningkatkan waktu respons untuk tugas yang mudah.
Nayan Katkani