2013-04-24 2 views
8

날짜가 2012 년 4 월 4 일인 레코드를 반환해야합니다 (예 :). ODATA 서비스의 날짜 필드는 {DATE : "2013-04-04T17 : 39 : 33.663"}ODATA DATE QUERY

과 같이 반환됩니다. 쿼리는 어떻게 보이게됩니까?

지금까지 세 가지 옵션을 살펴 보았지만 그 중 하나도 간단하지 않습니다.

옵션 하나를 datetime'2013-04-04T12 : 00 '이 시간의 사양을 필요로

옵션 2 : 월 (DATE) EQ 04일 EQ (DATE) 04년 (DATE) EQ 2013 :이 성가신입니다

옵션 3 : 두 개의 날짜 사이에 레코드를 가져 오기 위해 'ge'및 'le'옵션 1을 사용하십시오. 이것은 또한 쓰레기입니다.

T-SQL과 마찬가지로 매우 간단해야합니다.

답변

12

OData v3에는 Date의 원시 데이터 형식이 없습니다. 보유하고있는 속성은 DateTime 또는 DateTimeOffset이므로 사용 여부에 관계없이 값의 시간 부분이 있으며 값의 동일성을 확인하려면 시간 구성 요소를 확인해야합니다 게다가.

당신이 결코 시간 부분을 사용하지 (항상 00:00으로 설정) 것을 확실히 알고 있다면, 다음 쿼리 수행

/service.svc/EntitySet?$filter=DateProperty+eq+datetime'2013-04-04' 

00의 시간 부분을 의미 : 00. 그러나 그것은 단지 속기 일뿐입니다. 그리고 일부 DateTimes가 00:00이 아닌 시간 부분으로 끝나는 경우 예기치 않은 결과가 발생할 수 있습니다.

/service.svc/EntitySet?$filter=day(DateProperty)+eq+4+and+month(DateProperty)+eq+4+and+year(DateProperty)+eq+2013 

그 방법 :

그래서, 당신은 단지 날짜 값의 부분 및 완전하지 평등을 확인하려는 주어, 나는 당신이 언급 두 번째 방법이 가장 좋은 그것에 대해가는 방법이라고 생각 당신은 당신이 무엇을 의미하는지 정확히 확인하고 있습니다.

가치가있는 부분에 대해서는 Date 데이터 형식이 OData v4에 포함될 것으로 생각됩니다. 그러면 시간에 대한 걱정없이 평등 검사를 사용할 수 있습니다.

+0

oData V3에서 처음 부분이 작동하지 않습니다. – Matt

2

또한 ODR 요청 생성을 위해 LINQPAD을 사용할 수도 있다고 말하고 싶습니다. LINQ 요청을 만들어야하며 LINQPAD가 올바른 URI를 생성합니다.

  • Linq는 : 예를 들어
  • ev.Start> = DateTime.Now.Date 선택 EV

    • LINQPAD가 하나로, OData URI를 생성 이벤트 에서 EV로부터

    :

    http://yoursite/_vti_bin/listdata.svc/Events()?$filter=Start ge datetime'2013-12-05T00:00:00+01:00'
  • orrect 형식. 내 경우에는 "+01 : 00"을 삭제합니다.

또한 Visual Studio를 사용하여 Odata 요청을받을 수 있습니다.