Linq의 DateTime 유형에서 시간이없는 날짜 만 Entity Framework를 사용하여 SQL과 비교하는 방법은 무엇입니까?


303

두 DateTime변수 를 비교 Linq2Sql하지만 시간 부분을 무시 하는 방법이 있습니까?

앱은 DB에 항목을 저장하고 게시 날짜를 추가합니다. 정확한 시간을 유지하고 싶지만 여전히 날짜 자체를 잡아 당길 수 있습니다.

나는 실제 시간 을 비교 12/3/89 12:43:34하고 12/3/89 11:22:12무시하기를 원하므로 둘 다 동일하게 간주됩니다.

나는 00:00:00비교하기 전에 하루 종일 모든 시간을 설정할 수 있다고 생각 하지만 실제로는 날짜별로 만 비교할 수있는 시간을 알고 싶습니다.

동일한 문제가있는 코드를 발견하고 연도, 월 및 일을 개별적으로 비교합니다. 더 좋은 방법이 있습니까?

답변:


534

객체 의 Date속성을 사용해보십시오 DateTime...

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

25
2017 년 초 이후에 Entity Framework 환경에서 날짜를 비교하는 방법을 찾고 여기에 있으면 Alejandro의 아래 답변과 wasatchWizard의 의견을 확인하십시오.
— Mike Devenney

8
2018 년 중반 이후에 위와 같은 매우 유용한 의견을 읽을 수있는 방법을 찾고 있다면 운이 나쁘다.
— nardnob

4
2019 년 초에 만화 구호를 찾은 후에 언젠가는 이곳을 찾았습니다.
— Phil Ringsmuth

1
이것은 정답이 아닙니다. OP는 Linq to SQL 및 datetime.date는 linq 표현식에서 허용되지 않는다고 구체적으로 말했습니다.
— Philip Vaughn

2
2020 년 초 이후에 여기에 오면 코로나 바이러스 전염병이 발생하는 동안 스스로 돌보고 집에 머물기를 바랍니다. 2021 년에 여기로 돌아가십시오!
— Mr. Ott

61

진정한 비교를 위해 다음을 사용할 수 있습니다.

dateTime1.Date.CompareTo(dateTime2.Date);

18
"진정한 비교"란 정확히 무엇을 의미합니까?
— Randolpho

6
Randolpho : ==를 사용하면 두 날짜가 같거나 다른지 여부에 관계없이 평등을 제공합니다. CompareTo는 그것들을 ~ 비교할 것입니다. 즉 : date1> date2, date1 <date2, 또는 date1 == date2인지를 한 번에 알 수 있습니다.
— Reed Copsey

6
@ReedCopsey (dateTime1.Date <dateTime1.Date) 만 사용할 수 있습니까?
— David

14
하지만 누가 원하는 -1, 0그리고 1정말? 그것들은 단지 "덜", "같음"및 "더 큰"을 나타내는 마법의 숫자 일뿐입니다. 그리고 세 개의 가능한 값이 있기 때문에 결과 정수를 나중에 무언가와 "비교"해야합니다. 나는 그것이 훨씬 더 자연스럽게 사용하는 것입니다 @ 데이비드에 동의해야 dateTime1.Date < dateTime1.Date하고, 유사와 <=, >그리고 >=대부분의 응용 프로그램에.
— Jeppe Stig Nielsen

8
@JeppeStigNielsen 당신이 그것을 정렬하거나 동료를 취하는 어떤 것에 이것을 사용한다면, 당신은 그것을 원합니다-그렇지 않으면, 당신은 일반적으로 연산자를 원합니다.
— 리드 콥시

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.DateLINQ 에서만 작동하지 않는 경우 (오류 : 지정된 형식 멤버 'Date'는 LINQ to Entities에서 지원되지 않습니다)


22
이것은 LINQ to Entities에서 잘 작동합니다. 그러나 EntityFunctions.NET 4.5.2에서는 더 이상 사용되지 않습니다. 대신 이것을 사용하십시오 : DbFunctions.TruncateTime. 같은 방식으로 방금 움직
— 였습니다

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

정답이어야합니다 (2019 년 기준). EntityFunctions는 감가 상각되며 람다 식에서 datetime.date를 사용할 수 없습니다 (어떤 이유로 든-심각하게 의미합니다 ... 왜 이것을 고치지 않았습니까?!).
— 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");
}

널 입력 가능 DateField를 사용하는 경우이를 사용할 수 있습니다.


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를 사용할 수 있습니다 .

같음 : 두 DateTime 인스턴스의 날짜 및 시간 값이 같은지 여부를 나타내는 값을 반환 합니다.

CompareTo 반환 값 :

  1. 0보다 작음 :이 인스턴스가 값보다 빠른 경우.
  2. Zero :이 인스턴스가 값과 같은 경우
  3. 0보다 큼 :이 인스턴스가 값보다 늦은 경우.

DateTime은 널 입력 가능합니다.

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은 널 입력 가능하지 않습니다.

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.