2016-07-14 6 views
1

x.CreateDateDateTime은 밀리 초 단위로 데이터베이스에 저장됩니다. 내 dateTimePicker 값 startdate 및 enddate는 초 단위까지만 쿼리 할 수 ​​있습니다.LINQ DateTime 밀리 초를 무시하는 쿼리

밀리 초를 무시하도록 쿼리를 변경하려면 x.CreateDate? 아래에 작성한 코드는 효과가 있지만 작동하지 않을 것이라고 생각했습니다.

if (stardDateIsValid && endDateIsValid && startdate == enddate) 
    query = _context.Logs 
     .Where(x => x.ApplicationID == applicationId && 
        x.CreateDate.AddMilliseconds(-x.CreateDate.Millisecond) == startdate) 
     .OrderByDescending(x => x.ID) 
     .Take(count); 
+0

, 당신이 작동하지 않습니다 어떤 방법으로 우리에게 이야기한다. – DavidG

+0

감사합니다. 결과를 반환하지 않습니다. – user2415620

+0

'startdate '형식은 무엇입니까? –

답변

0

왜 여러 주제의 변형을 시도했는지에 대해 위에 게시 된 쿼리에서 어떤 결과도 얻을 수 없었습니다. 그러나 나는 그것을 시작하고 종료 날짜 변수에 밀리 세컨드를 추가함으로써 제대로 작동하게 만들었고 작동했다.

if (stardDateIsValid && endDateIsValid) 
    startdate = startdate.AddMilliseconds(000); 
    enddate = enddate.AddMilliseconds(999); 
    query = _context.Logs.Where(x => x.ApplicationID == applicationId && x.CreateDate >= startdate && x.CreateDate <= enddate).OrderByDescending(x => x.ID).Take(count); 
+1

'startdate = startdate.AddMilliseconds (000);은 아무 것도하지 않으며 제거 될 수 있습니다. 'enddate = enddate.AddMilliseconds (999);'는'enddate = enddate.AddSeconds (1);'과'x.CreateDate

+0

제임스 감사합니다. – user2415620

1

같은 형식으로 CreateDatestartdate을 얻는 것은 당신이 사과에 사과를 비교하는 데 도움이됩니다. 이것은 그것을 성취해야합니다.

if (stardDateIsValid && endDateIsValid && startdate == enddate) 
    query = _context.Logs 
     .Where(x => x.ApplicationID == applicationId && 
        x.CreateDate.ToString(@"MM/DD/YYYY h:mm:ss") == startdate.ToString(@"MM/DD/YYYY h:mm:ss") 
     .OrderByDescending(x => x.ID) 
     .Take(count); 
+0

감사하지만 여전히 결과가 반환되지 않습니다. '코드 _context.Logs가 { [Extent1] [Extent1]. [ID] AS [ID]를 선택한다. [메시지] AS [메시지, [Extent1]. [애플리케이션 ID] AS [애플리케이션 ID, [Extent1 [데이터] AS [로그] AS [익스텐트 1] 베이스 : {선택 [익스텐트 1]. [ID] AS [CreateDate] AS [CreateDate] [Extent1] [응용 프로그램 ID] AS [응용 프로그램 ID], [Extent1]. [CreateDate] AS [CreateDate], [Extent1]. [데이터] [Extent1]. [메시지] AS [메시지] [ ] AS [데이터] FROM [dbo]. [로그] AS [범위 1]} 로컬 : 개수 = 0 – user2415620

+1

x.CreateDate.ToSt (@ "MM/DD/YYYY h : mm : ss") == startdate.ToString (@ "MM/DD/YYYY h : mm : ss") –

+1

@CiroCorvino 좋은 생각! 내가 업데이 트됩니다 –

1
var query = from l in _context.Logs 
      where l.ApplicationID == applicationId 
      && SqlMethods.DateDiffSecond(l.CreateDate,startdate) == 0 
      orderby l.ID descending 
      select l).Take(count); 

이 날짜로 두 날짜를 비교하여, 문자열 및 후속 문자열 비교에 사용하면 테이블의 모든 날짜를 변환 방지 할 수 있습니다.

+0

고마워 제임스지만 l.CreateDate 값은 밀리 초 및 startdate 포함하지 않기 때문에, 내가 올바르게 이해하면 아무것도 반환하지 않을거야? Sqlmethods에 대한 어셈블리 참조를 추가하고 시도해 보았습니다. 오류는 없지만 결과를 반환하지 않습니다. – user2415620

+1

@ user2415620'DateDiffSecond'는 초 차이 만 비교합니다. (Northwind db를 사용하여 테스트했고 자정 이후 0.5 초의 시작 시간) –

0

확장 방법을 만들 수 있습니다.

public const long TicksPerMillisecond = 10000; 
public const long TicksPerSecond = TicksPerMillisecond * 1000; 

public static bool IsEqualIgnoreMilliseconds(this DateTime date, DateTime compareDate) 
{ 
    long tickDiff = date.Ticks - compareDate.Ticks; 
    return tickDiff > 0 ? tickDiff < TicksPerSecond : tickDiff < -TicksPerSecond; 
} 

그럼 당신은이를 사용할 수 있습니다 : 당신이 "가 작동하지 않습니다"말할 때

if (stardDateIsValid && endDateIsValid && startdate == enddate) 
    query = _context.Logs 
    .Where(x => x.ApplicationID == applicationId && 
       x.CreateDate.IsEqualIgnoreMilliseconds(startdate) 
    .OrderByDescending(x => x.ID) 
    .Take(count); 
관련 문제