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.