Làm cách nào để so sánh Ngày không có Thời gian trong các loại DateTime trong Linq với SQL với Entity Framework?


303

Có cách nào để so sánh hai DateTimebiến trong Linq2Sqlnhưng bỏ qua phần Thời gian.

Ứng dụng lưu trữ các mục trong DB và thêm ngày 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.

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

Tôi đoán tôi có thể đặt tất cả thời gian trong ngày thành 00:00:00trước khi tôi 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 mà thôi.

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

Câu trả lời:


534

thử sử dụng thuộc Datetính trên DateTimeObject ...

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

25
Nếu bạn kết thúc ở đây vào khoảng đầu năm 2017 để tìm cách so sánh ngày trong môi trường Entity Framework như tôi đã xem câu trả lời dưới đây của Alejandro và nhận xét của wasatchWizard.
Mike Devenney

8
Nếu bạn kết thúc ở đây vào khoảng giữa năm 2018 để tìm cách đọc một bình luận cực kỳ hữu ích như ở trên, bạn đã hết may mắn.
nardnob

4
Nếu bạn kết thúc ở đây vào khoảng đầu năm 2019 để tìm kiếm sự giải thoát cho truyện tranh, bạn đã tìm thấy nó.
Phil Ringsmuth

1
Đây hoàn toàn KHÔNG phải là câu trả lời đúng. OP đặc biệt nói Linq to SQL và datetime.date KHÔNG được phép trong các biểu thức linq.
Philip Vaughn

2
Nếu bạn kết thúc ở đây vào khoảng đầu năm 2020, tôi hy vọng bạn sẽ tự chăm sóc bản thân và ở nhà trong cuộc khủng hoảng đại dịch coronavirus. Quay trở lại đây vào năm 2021!
Ông Ott

61

Để so sánh đúng, bạn có thể sử dụng:

dateTime1.Date.CompareTo(dateTime2.Date);

18
Chính xác thì bạn có ý gì khi "so sánh thật"?
Randolpho

6
Randolpho: Sử dụng == sẽ mang lại cho bạn sự bình đẳng, do đó, cho dù hai ngày giống nhau hay khác nhau. So sánh sẽ ~ so sánh ~ chúng, tức là: cung cấp cho bạn một cách trong một lượt để biết nếu date1> date2, date1 <date2 hoặc date1 == date2.
Sậy Copsey

6
@ReedCopsey Bạn không thể sử dụng (dateTime1.Date <dateTime1.Date)?
David

14
Nhưng ai muốn -1, 01, thực sự? Chúng chỉ là những con số ma thuật đại diện cho "ít", "bằng" và "lớn hơn". Và bạn sẽ phải "so sánh" số nguyên kết quả với một cái gì đó sau đó bởi vì có ba giá trị có thể. Tôi phải đồng ý với @David rằng việc sử dụng sẽ tự nhiên hơn nhiều dateTime1.Date < dateTime1.Date, và tương tự với <=, >>=, trong hầu hết các ứng dụng.
Jeppe Stig Nielsen

8
@JeppeStigNielsen Nếu bạn đang sử dụng cái này trong bất cứ thứ gì sắp xếp hoặc lấy comaprison, thì bạn muốn nó - nếu không, bạn thường chỉ muốn các toán tử.
Sậy Copsey

45

Đây là cách tôi làm điều 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.Datethì nó sẽ không hoạt động với LINQ (Lỗi: Loại thành viên được chỉ định 'Ngày' không được hỗ trợ trong LINQ to Entities)


22
Điều này hoạt động rất tốt với LINQ to Entities. Tuy nhiên, EntityFunctionsđã bị phản đối trong .NET 4.5.2. Sử dụng cái này thay thế : DbFunctions.TruncateTime. Nó dường như là phương thức giống hệt nhau, vừa di chuyển ..
wasatchwizard

25

Nếu bạn đang sử dụng Entity Framework <v6.0, thì hãy sử dụng EntityFunctions.TruncateTime Nếu bạn đang sử dụng Entity Framework> = v6.0, sau đó sử dụngDbFunctions.TruncateTime

Sử dụng (dựa trên phiên bản EF của bạn) xung quanh bất kỳ thuộc tính DateTimelớp nào bạn muốn sử dụng trong truy vấn Linq của bạn

Thí dụ

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

Chỉ cần một lời nhắc nhở ở đây: Miễn là Linq to Entity.
tò mòBoy 15/03/18

Đây phải là câu trả lời chính xác (tính đến năm 2019). EntityFifts bị khấu hao và bạn không được phép sử dụng datetime.date trong biểu thức lambda (vì bất kỳ lý do gì - ý tôi là nghiêm túc ... tại sao họ không sửa cái này?!).
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");
}

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


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

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


1

Bạn có thể sử dụng Bằng hoặc So sánh .

Bằng nhau : Trả về một giá trị cho biết hai trường hợp DateTime có cùng giá trị ngày và thời gian hay không.

So sánh giá trị trả về :

  1. Nhỏ hơn 0 : Nếu trường hợp này sớm hơn giá trị.
  2. Zero : Nếu trường hợp này giống như giá trị.
  3. Lớn hơn 0 : Nếu trường hợp này muộn hơn giá trị.

DateTime là nullable:

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

hoặc là

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 không thể rỗng:

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

hoặc là

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

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


0

Bạn co thể thử

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: Tại sao không chỉ phân tích theo DateTime và sử dụng phương thức của @Quintin Robinson? Đây là mã tôi mong đợi để xem trên The Daily WTF.
William Hurst

Không cần tạo nhiều biến này vì nó tăng thời gian phản hồi cho một nhiệm vụ dễ dàng như vậy.
Naya Katkani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.