2016-04-14 2 views
3

J'écris une requête dans SPARQL et je veux comparer la valeur de la date sans le temps. Actuellement, j'obtiens une valeur datetime telle que 2014-08-14T13:00:00Z. Cependant, je veux faire un filtre à la date tels queRetirer le temps de datetime dans spaqrl

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

Je suis nouveau à SPARQL, donc je besoin d'aide. Merci.

EDITED


Merci pour les gars de réponse. Mes excuses pour le xsd:dateTime

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

j'ai décidé d'essayer ce qui suit, bien que je voulais une solution beaucoup plus « plus jolie ».

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

Prenez garde que '" 2014-08-15 "^^ xsd: dateTime' ne soit pas une date légale, même s'il s'agit d'une date légale" xsd: date' ". –

+0

Suggérer l'utilisation de '" 2014-08-15 "^^ xsd: date' à la place. – scotthenninger

Répondre

2

Vous pouvez le faire, mais pas exactement comme votre question le demande. Les formes littérales pour dateTimes doivent avoir tous les champs (sauf le fuseau horaire), donc "2014-08-15" ^^ xsd: dateTime n'est pas réellement un dateTime légal. Voir the definition pour plus d'informations sur le format d'heure.

Cela dit, il est assez facile de sortir l'année, le mois et le jour d'un datetime et les remettre ensemble en une date que vous pouvez comparer avec d'autres dates:

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 | 
-------------------------------------------------------------------------- 

Si vous voulez inclure le fuseau horaire, vous pouvez le faire aussi; ils sont autorisés dans xsd: dates.

Si vous voulez filtrer sans créer la nouvelle date, vous pouvez aussi faire quelque chose comme

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

Cela pourrait être une solution assez propre. Une note sur votre filtre , cependant. Vous pouvez filtrer la valeur d'une variable par rapport à une constante comme vous l'avez fait, mais cela suggère souvent (mais pas toujours) un moyen plus simple. Par exemple, au lieu de:

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

vous auriez habituellement juste utiliser la valeur en place, ou utilisez valeurs pour spécifier la valeur d'une variable:

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

Vous pouvez essayer un cast simple à xsd:date, mais le moteur SPARQL conservera probablement l'heure. Donc, il devient une question d'analyse.Une façon est d'utiliser simplement SUBSTR, comme le nombre de caractères est connu:

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

Une autre est de construire la date du format datetime:

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

Peut-être pas aussi pratique étant donné que CONCAT nécessite une conversion de chaîne , mais l'idée générale consiste à générer la chaîne à partir de la valeur datetime et à la convertir en xsd:date.

+0

notez que la solution substr (et la concaténation de chaînes que vous et moi avons utilisée) ont un point faible en ce qu'elles n'incluent pas le fuseau horaire, et les fuseaux horaires * sont * autorisés dans xsd: dates. –

+0

Je ne suis pas sur tous mes arithmétique date, mais n'est-il pas possible que YYYY-MM-DD dans un fuseau horaire pourrait être la même date que YYYY-MM-DD + 1 dans un autre? Préserver ces fuseaux horaires pourrait être important. –

+0

Oui, cela semble être un sujet différent, et très dépendant de la façon dont les temps sont générés et quelles comparaisons sont nécessaires. On peut toujours ajouter le décalage pour arriver à l'UTC. – scotthenninger