2016-04-14 16 views
3

Ich bin eine Abfrage in SPARQL schreiben, und ich möchte den Datumswert ohne die Zeit zu vergleichen. Momentan erhalte ich einen Datetime-Wert wie 2014-08-14T13:00:00Z. Allerdings möchte ich an dem Tag einen Filter tun, wieZeit von Datetime in spaqrl entfernen

FILTER (?date = "2014-08-15"^^xsd:dateTime) 

Ich bin neu in SPARQL, so dass ich brauche Hilfe. Vielen Dank.

EDITED


Danke für die Antwort Jungs. Ich entschuldige mich für die xsd:dateTime

FILTER (?date = "2014-08-15"^^xsd:date) 

Ich habe beschlossen, die folgende versuchen, obwohl ich eine viel ‚schönere‘ Lösung gesucht.

FILTER (?date >= "2014-08-15T00:00:00Z"^^xsd:dateTime && ?date <= "2014-08-15T24:00:00Z"^^xsd:dateTime) 
+0

Beachten Sie, dass "2014-08-15" ^^ xsd: dateTime "möglicherweise keine gültige Datumsangabe ist, auch wenn es sich um ein legales" xsd: date "handelt. –

+0

Vorschlagen mit "2014-08-15" ^^ xsd: date' stattdessen. – scotthenninger

Antwort

2

Sie können dies tun, aber nicht genau die Art, wie Ihre Frage fragt. Die wörtlichen Formen für datetime haben all Felder (mit Ausnahme der Zeitzone), so „2014.08.15“ ^^ xsd: datetime ist nicht wirklich eine rechtliche Datums- und Uhrzeit. Weitere Informationen zum Format der Datumszeit finden Sie unter the definition.

Das heißt, es ist leicht genug, um das Jahr, den Monat zu ziehen, und Tag von einem Datetime und setzte sie wieder zusammen in ein Datum, das Sie mit anderen Terminen vergleichen:

prefix xsd: <http://www.w3.org/2001/XMLSchema#> 

select ?dt ?date where { 
    values ?dt { "2011-01-10T14:45:13.815-05:00"^^xsd:dateTime } 

    bind(xsd:date(concat(str(year(?dt)),"-", 
         str(month(?dt)),"-", 
         str(day(?dt)))) 
     as ?date) 
} 
-------------------------------------------------------------------------- 
| dt           | date     | 
========================================================================== 
| "2011-01-10T14:45:13.815-05:00"^^xsd:dateTime | "2011-01-10"^^xsd:date | 
-------------------------------------------------------------------------- 

Wenn Sie die Zeitzone einschließen möchten, können Sie das auch tun; Sie sind erlaubt in xsd: dates.

Wenn Sie ohne die Erstellung das neue Datum filtern wollten, könnten Sie auch so etwas wie

filter (year(?dt) = 2015 && 
     month(?dt) = 01 && 
     day(?dt) = 10) 

tun, die eine ziemlich saubere Lösung sein könnte. obwohl

Eine Anmerkung zu Ihrem Filter. Sie können den Wert einer Variablen wie eine Konstante gegen eine Konstante filtern, was aber oft (aber nicht immer) einen einfacheren Weg vorschlägt. Zum Beispiel statt:

select ?s where { 
    ?s a ?o . 
    filter (?o = <something>) 
} 

würden Sie in der Regel nur den Wert an Ort und Stelle verwenden, oder Werte verwenden Sie den Wert einer Variablen zu spezifizieren:

select ?s where { 
    ?s a <something> . 
} 
select ?s where { 
    values ?o { <something> } 
    ?s a ?o . 
} 
1

Sie könnten versuchen, eine einfache Umwandlung zu xsd:date, aber die SPARQL-Engine behält wahrscheinlich die Zeit. Es wird also eine Frage des Parsens.Eine Möglichkeit ist, nur SUBSTR zu verwenden, da die Anzahl der Zeichen bekannt ist:

FILTER (xsd:date(SUBSTR(str(?date), 0, 11)) = "2014-08-15"^^xsd:date) 

Ein weiterer Grund ist das Datum von Datetime-Format zu erstellen:

FILTER (xsd:date(CONCAT(str(YEAR(?date)), "-", str(MONTH(?date)), "-", str(DAY(?date)))) = "2014-08-15"^^xsd:date) 

Vielleicht nicht so bequem da CONCAT erfordert String-Konvertierung , aber die allgemeine Idee besteht darin, die Zeichenfolge aus dem Datetime-Wert zu erstellen und in xsd:date zu konvertieren.

+0

Beachten Sie, dass die substr-Lösung (und die String-Verkettung, die Sie und ich beide verwendet haben) eine Schwäche haben, da sie die Zeitzone nicht enthalten und Zeitzonen * in xsd: dates * erlaubt sind. –

+0

Ich bin nicht auf alle meine Datum Arithmetik, aber ist es nicht möglich, dass YYYY-MM-DD in einer Zeitzone das gleiche Datum sein könnte wie YYYY-MM-DD + 1 in einem anderen? Die Erhaltung dieser Zeitzonen könnte wichtig sein. –

+0

Ja, das scheint ein anderes Thema zu sein und hängt sehr davon ab, wie die Zeiten generiert werden und welche Vergleiche nötig sind. Man kann immer den Offset hinzufügen, um zu UTC zu kommen. – scotthenninger