2013-04-24 23 views
8

Ich muss Datensätze zurückgeben, die ein Datum vom 4/4/2013 haben (zum Beispiel). Das Datumsfeld im ODATA-Service gibt als {DATE: "2013-04-04T17: 39: 33,663"}ODATA DATUM ABFRAGE

zurück Wie soll die Abfrage aussehen?

Bis jetzt habe ich drei Möglichkeiten gesehen, um dies zu tun, aber keiner von ihnen ist geradlinig.

Option eins: datetime'2013-04-04T12: 00' : dies erfordert Spezifikation der Zeit

Option zwei: Monat (DATE) eq 04 Tage (DATE) eq 04 Jahre (DATE) eq 2013: Diese ist umständlich

Option drei: Verwenden Sie Option eins mit 'ge' und 'le', um Datensätze zwischen 2 Daten zu bekommen: das ist auch Mist.

Dies sollte sehr einfach sein, wie es in T-SQL ist.

Antwort

12

OData v3 hat keinen primitiven Datentyp, der nur Date ist. Die Eigenschaft, die Sie haben, ist entweder ein DateTime oder ein , also, ob Sie es verwenden oder nicht, gibt es einen Zeitabschnitt dieses Werts, und wenn Sie den Wert für die Gleichheit überprüfen möchten, muss die Zeitkomponente überprüft werden auch.

Wenn Sie sicher sind, dass Sie nie die Zeit Teil verwenden (und es immer auf 00:00 Uhr), können Sie konnte tun die folgende Abfrage:

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

, die einen Zeitabschnitt von 00 bedeutet, : 00. Aber das ist nur Kurzschrift. Und Sie könnten unerwartete Ergebnisse haben, wenn einige Ihrer DateTimes mit Zeitabschnitten enden, die nicht 00:00 sind.

So gegeben, dass Sie nur den Datumsteil des Wertes überprüfen möchten, und nicht die volle Gleichheit, ich glaube, der zweite Ansatz, den Sie erwähnen, ist der beste Weg zu gehen darüber:

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

Auf diese Weise Sie überprüfen genau, was Sie vorhaben zu überprüfen und nichts mehr.

Für was es wert ist, glaube ich, dass ein Date Datentyp in OData v4 kommt. Dann können Sie die Gleichheitsprüfung verwenden, ohne sich um die Uhrzeit Gedanken machen zu müssen.

+0

Der erste Teil funktioniert bei mir in oData V3 nicht – Matt

2

Zusätzlich möchte ich sagen, dass Sie auch LINQPAD für die Generierung von OData-Anfragen verwenden können. Sie sollten eine LINQ-Anfrage machen, und LINQPAD wird den korrekten URI erzeugen. Zum Beispiel:

  • Linq:

von ev in Events wo ev.Start> = DateTime.Now.Date wählen ev

  • LINQPad OData URI generiert:

    http://yoursite/_vti_bin/listdata.svc/Events()?$filter=Start ge datetime'2013-12-05T00:00:00+01:00'
  • Stellen Sie es auf c orrect Format. In meinem Fall lösche ich "+01: 00".

Auch Sie können Visual Studio verwenden, um Odata-Anforderung zu erhalten.