2014-12-02 2 views
0

약 12/1/2014 9:40:12 PM에 다음 코드는 null 값을 검색합니다.DateTime 비교가있는 Linq 쿼리가 예상대로 작동하지 않습니다.

Campaign camp = repo.Campaigns 
        .Where(ca => ca.StartTime <= DateTime.Now) 
        .Where(ca => ca.EndTime >= DateTime.Now) 
        .FirstOrDefault(); 

다음 값을 사용하여 데이터베이스에서 캠페인이 :이 발생하는 이유 완전한 딱하다

Start Time: 
2014-11-30 00:00:00.000 

End Time: 
2014-12-02 00:00:00.000 

가.

+0

문제는 당신의 날짜 시간 비교와 것 같다, 당신에게 일, 시간, 분을 좋아하는 속성 사용 후 날짜 시간 객체 밖으로 시간 범위를 만들 수행 할 수 있고 비교를 얻을, 뭔가 같은 : (DateTime.Now-ca.StartTime) .Days> 날짜 시간 비교에 대한 링크를 0 확인 : http://stackoverflow.com/questions/22564846/c-sharp-compare -two-datetimes –

+0

는 틱으로 날짜 시간을 변환 한 다음 비교합니다.그런 식으로 도울 수 있습니다 – Vishal

+0

'DateTime.Now'는 [변환됩니다] (http://derreckdean.wordpress.com/2013/03/18/linq-to-sql-linq-to-ef-datetime-now-and -getdate-woes /)를'GetDate()'에 추가하고 데이터베이스 서버의 시간대가 다른 경우 때때로 상황이 나빠질 수 있습니다. 해당 링크에서 문제를 해결하십시오. –

답변

0

이 시도 : 그것은 무슨 일이 일어나고

Campaign camp = repo.Campaigns 
      .Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date && ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault(); 
-1

시간이 당신이 같은 상영을 비교하기 때문에 ENDTIME이 당신의 DateTime.Now가 픽업 한 문화와 다른 날짜 형식의입니다

**

DateTime.Now- 12/1/2014 9:40:12 PM 
Start Time: 2014-11-30 00:00:00.000 
End Time: 2014-12-02 00:00:00.000 

**

은 당신의 상영으로 같은 형식으로ENDTIME 당신의 Datetime.Now 날짜 형식을 변경

2014년 12월 1일 오후 9시 40분 12초

그리고 난 당신이 결과를 얻을 것이라고 확신합니다.

+0

linqpad에서이 작업을 수행 할 때 현재 날짜가 12 월 1 일이 아닌 12 월 1 일을 선택했을 때 이에 동의합니다. – Johan

+0

그는 "12/1/2014 9:40:12"문자열에서 DateTime을 작성하지 않습니다. PM "이라고 말합니다. 1 월 12 일과 12 월 1 일이 아닌 이유는 컴퓨터의 현재 문화 설정 때문입니다 ... 텍스트에서 날짜 및 시간 값을 파싱 할 때 올바른 문화 정보/형식을 DateTime 순서로 명시해야 할 필요가 있습니다 올바르게 구문 분석합니다. – Cybrosys

+0

@Cybrosys - 문자열에서 DateTime을 설정하지 않고 컴퓨터의 현재 culture 집합에서 DateTime을 가져 왔음을 알고 있습니다.하지만 요구 사항에 따라 문화를 계속 변경해도됩니다.이 응용 프로그램을 실행하려면 다른 문화를 가진 다른 기계에서는 전혀 문제가되지 않습니다. !! – Vishal

0

시간대 정보를 고려 했습니까? DB의 저장된 데이터는 다른 시간대에서 실행중인 컴퓨터에서 작성되었을 수 있으며, DateTime 오브젝트는 다른 시간대를 가지며 데이터베이스로 전달되면 EndTime을 초과 할 수 있습니다.

메모리 내 데이터로 작업 할 때 코드가 작동하므로 문제는 아마도 시간대와 관련이 있습니다.

다른 말에 댓글을 쓰려면 다음을 입력하십시오. 1. 여러 개의 .Where 절을 체인으로 연결할 수 없을 때 체인을 연결하지 마십시오. 2. DateTime.Now를 사용하지 말고 DateTime.Now를 값에 저장 한 다음 LINQ로 전달하십시오. 그렇지 않으면 StartTime과 EndTime을 서로 다른 두 값과 비교합니다.

var now = DateTime.Now; 
Campaign camp = repo.Campaigns 
        .Where(ca => ca.StartTime <= now && ca.EndTime >= now) 
        .FirstOrDefault(); 
0

먼저 현재 시간보다 작은 날짜 시간을 선택합니다. 결과가 2 개 있다고 가정 해 봅시다. 다음은이 2 가지 결과에 대해 현재 값 이상인 DateTime을 쿼리하는 것입니다. 결과는 현재 날짜보다 작았 기 때문에 분명히 현재 날짜 val보다 클 수 없습니다. 나는 당신이하려는 생각 다음

Campaign camp = repo.Campaigns 
     .Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date **||** ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault(); 
관련 문제