2009-03-25 23 views
214

Có cách nào để so sánh 2 biến DateTime trong Linq2Sql hay không để bỏ qua phần Thời gian.Làm thế nào để so sánh chỉ ngày mà không có thời gian trong các loại DateTime trong LINQ to SQL với Entity Framework?

Ứng dụng lưu trữ các mục trong DB và thêm ngày được xuất bản. Tôi muốn giữ thời gian chính xác nhưng vẫn có thể kéo theo ngày chính nó.

Tôi muốn so sánh 12/3/89 12:43:34 và 12/3/89 11:22:12 và bỏ qua thời gian thực tế trong ngày để cả hai được coi là giống nhau.

Tôi đoán tôi có thể đặt tất cả thời gian trong ngày đến 00:00:00 trước khi so sánh nhưng tôi thực sự muốn biết thời gian trong ngày tôi cũng chỉ muốn có thể so sánh theo ngày tháng.

Tôi đã tìm thấy một số mã có cùng vấn đề và họ so sánh riêng năm, tháng và ngày. Có cách nào tốt hơn để làm điều này?

Trả lời

375

hãy thử sử dụng Date tài sản trên DateTime Object ...

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

Nếu bạn kết thúc ở đây lúc nào sau khi đầu năm 2017 tìm kiếm một cách để so sánh ngày tháng trong một môi trường Entity Framework như tôi đã kiểm tra câu trả lời dưới đây bởi Alejandro và bình luận bởi wasatchWizard. –

49

Đối với một sự so sánh đúng, bạn có thể sử dụng:

dateTime1.Date.CompareTo(dateTime2.Date); 
+0

không "==" trả về kết quả từ CompareTo trong nội bộ? –

+16

Chính xác bạn có ý nghĩa gì bởi "so sánh thực sự"? – Randolpho

+0

SnOrfus: Không phải lúc nào. Nhiều triển khai trả về a.CompareTo (b) == 0 cho ==, nhưng đó là tùy thuộc vào việc thực hiện. Tôi chưa kiểm tra sự cân bằng nội tại của DateTime. –

0

Trong bạn tham gia hoặc mệnh đề where, sử dụng tài sản Date của cột. Đằng sau hậu trường, điều này thực hiện một hoạt động CONVERT(DATE, <expression>). Điều này sẽ cho phép bạn so sánh ngày mà không có thời gian.

-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)) 
     { 
     } 
+7

-1: thao tác chuỗi không nên là một phần của giải pháp –

+5

-1: Tại sao không chỉ phân tích cú pháp DateTime và sử dụng phương thức @Quintin Robinson? Đây là mã tôi mong đợi để xem trên The Daily WTF. –

+3

-1 Một cách rất phức tạp để giải quyết một vấn đề đơn giản. – Wade73

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...."); 
} 
2
DateTime econvertedDate = Convert.ToDateTime(end_date); 
DateTime sconvertedDate = Convert.ToDateTime(start_date); 

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

Giá trị khác đại diện cho số ngày đối với tuổi. Nếu giá trị âm thì ngày bắt đầu sẽ rơi sau ngày kết thúc. Đây là một kiểm tra tốt.

23

Đây là cách tôi thực hiện việc này để làm việc với 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)); 

Nếu bạn chỉ sử dụng dtOne.Date == dtTwo.Date nó wont làm việc với LINQ (Lỗi: Loại thành viên 'Ngày' chỉ định không được hỗ trợ trong LINQ to Entities)

+7

Điều này làm việc tuyệt vời với LINQ to Entities. Tuy nhiên, 'EntityFunctions' đã không được chấp nhận trong .NET 4.5.2. Sử dụng thay vào đó: 'DbFunctions.TruncateTime'. Nó dường như là phương pháp giống hệt nhau, chỉ cần di chuyển .. – wasatchwizard

+0

Điều này làm việc người đàn ông thx tuyệt vời – jhony3

+0

Cảm ơn người đàn ông chỉ là những gì tôi cần. –

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 
    } 
4
DateTime? NextChoiceDate = new DateTime(); 
DateTIme? NextSwitchDate = new DateTime(); 
if(NextChoiceDate.Value.Date == NextSwitchDate.Value.Date) 
{ 
Console.WriteLine("Equal"); 
} 

Bạn có thể sử dụng điều này nếu bạn đang sử dụng DateFields không thể sử dụng.

10

Bạn nên sử dụng EntityFunctions.TruncateTime với EF < 6.0 và DbFunctions.TruncateTime trong EF> 6.0 xung quanh bất kỳ tài sản DateTime nào bạn muốn sử dụng bên trong LINQ của mình.

Ví dụ

var list = db.Cars.Where(c=> DbFunctions.TruncateTime(c.CreatedDate) 
             > DbFunctions.TruncateTime(DateTime.UtcNow)); 
Các vấn đề liên quan