2013-04-24 34 views
8

Tôi cần trả lại các hồ sơ có ngày 4/4/2013 (ví dụ). Trường ngày trong dịch vụ ODATA trả về là {DATE: "2013-04-04T17: 39: 33.663"}ODATA DATE QUERY

Truy vấn trông như thế nào?

Cho đến nay, tôi đã thấy ba tùy chọn để thực hiện việc này, nhưng không có tùy chọn nào trong số đó là thẳng về phía trước.

Lựa chọn một: datetime'2013-04-04T12: 00' : điều này đòi hỏi đặc điểm kỹ thuật của thời gian

Lựa chọn hai: tháng (NGÀY) eq 04 ngày (NGÀY) eq 04 năm (NGÀY) eq 2013: này là cồng kềnh

Tùy chọn ba: sử dụng tùy chọn một với 'ge' và 'le' để có được hồ sơ giữa 2 ngày: đây cũng là crap.

Điều này sẽ rất đơn giản như trong T-SQL.

Trả lời

12

OData v3 không có loại dữ liệu nguyên thủy chỉ là Date. Thuộc tính bạn có là DateTime hoặc DateTimeOffset, vì vậy, cho dù bạn đang sử dụng hay không, có một phần thời gian của giá trị đó và nếu bạn muốn kiểm tra giá trị cho bình đẳng, thì phải kiểm tra thành phần thời gian cũng.

Nếu bạn biết chắc chắn rằng bạn không bao giờ sử dụng phần thời gian (và luôn luôn đặt nó vào 00:00), bạn có thể làm truy vấn sau đây:

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

trong đó hàm ý một phần thời gian của 00 : 00. Nhưng đó chỉ là cách viết tắt. Và bạn có thể có kết quả không mong muốn nếu một số DateTimes của bạn làm gió lên với các phần thời gian không phải là 00:00.

Vì vậy, cho rằng bạn chỉ muốn kiểm tra phần cập nhật về giá trị, và bình đẳng không đầy đủ, tôi nghĩ rằng cách tiếp cận thứ hai bạn đề cập đến là cách tốt nhất để đi về nó:

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

Bằng cách đó bạn đang kiểm tra chính xác những gì bạn muốn kiểm tra và không có gì hơn.

Đối với những gì đáng giá, tôi tin rằng kiểu dữ liệu Date sẽ xuất hiện trong OData v4. Sau đó, bạn sẽ có thể sử dụng kiểm tra bình đẳng mà không đáng lo ngại về thời gian.

+0

Phần đầu tiên không hoạt động đối với tôi trong oData V3 – Matt

2

Ngoài ra, tôi muốn nói rằng bạn cũng có thể sử dụng LINQPAD để yêu cầu OData thế hệ. Bạn nên yêu cầu LINQ và LINQPAD sẽ tạo ra URI đúng. Ví dụ:

  • LINQ:

từ ev trong Sự kiện nơi ev.Start> = DateTime.Now.Date chọn ev

  • LINQPad tạo OData URI:

    http://yoursite/_vti_bin/listdata.svc/Events()?$filter=Start ge datetime'2013-12-05T00:00:00+01:00'
  • Điều chỉnh nó thành c định dạng orrect. Trong trường hợp của tôi, tôi xóa "+01: 00".

Ngoài ra, bạn có thể sử dụng Visual studio để nhận yêu cầu Odata.