2013-09-03 6 views
6

Quelle est la fonction pour calculer la différence entre deux SPARQL xsd: dateTime?SPARQL Calcul de la différence entre deux dates

J'ai trouvé une référence à datediff, mais cela ne fonctionne pas. Est-ce qu'une telle fonction intégrée existe dans SPARQL comme avec la plupart des autres langages de requête?

+0

Avez-vous demandé cette question plus tôt en tant qu'utilisateur anonyme, puis le supprimer? J'aurais pu jurer que j'ai répondu à une question presque identique plus tôt aujourd'hui. –

+0

@JoshuaTaylor J'ai posé une question, mais cela en faisait partie et pas exactement cette question. Les deux questions sont différentes et je ne l'ai pas supprimé. –

+1

Ok, juste curieux, car il y avait une question sur la soustraction de xsd: dates, et le fait qu'ils produisent une durée, et comment obtenir le nombre d'années à la place. C'est pourquoi j'avais le code SPARQL tout prêt à partir. Juste une coïncidence étrange, peut-être. –

Répondre

8

Certains moteurs SPARQL peuvent prendre directement en charge l'arithmétique des dates. Par exemple, comme mentionné dans this answers.semanticweb.com question and answer, Jena prend en charge l'arithmétique de date, et vous pouvez soustraire une date d'une autre et obtenir un xsd: Duration. D'autres implémentations peuvent supporter une fonction datediff. Par exemple, this Virtuoso example inclut l'utilisation de bif: datediff. Cependant, il s'agit d'extensions et il n'est pas garanti qu'elles soient présentes dans une implémentation SPARQL particulière.

Pour une solution plus portable, mais peut-être moins efficace, vous pouvez utiliser le year pour extraire les pièces d'une année. Cela vous permet de faire, par exemple,

select ?age where { 
    bind("1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death) 
    bind("1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth) 
    bind(year(?death)-year(?birth) as ?age) 
} 

et obtenir des résultats

------- 
| age | 
======= 
| 67 | 
------- 

Cela a le potentiel d'être hors d'un, selon les mois et les jours des deux dates, mais vous pouvez de la même contourner ce problème en utilisant les fonctions month et day. This thread décrit certaines de ce type d'implémentation.

+0

Le lien est mort, veuillez le mettre à jour. –

+0

@ KimA.Jakobsen Il existe un certain nombre de liens, mais je suppose que vous voulez dire le premier. Le site answers.semanticweb.com est un peu floconneux à certains moments. Je m'attends à ce qu'il soit de retour avant longtemps. Cela dit, la machine d'archivage Internet/wayback a une copie à https://web.archive.org/web/20131026044936/http://answers.semanticweb.com/questions/24017/jena-arq-date-diff. –

+0

Ok, ça aurait pu être un peu trop rapide, je vais retrouver le site bientôt. merci pour la page d'archives :) –

6

J'ai trouvé cet article lorsque je cherchais comment calculer un âge dans SPARQL. Merci à Joshua Taylor pour avoir donné le bon indice. Cependant, j'ai amélioré le segment de code en ajoutant un ajustement de sorte qu'il ne soit pas retiré d'un an si la personne n'a pas eu son anniversaire l'année de son décès. Je pensais que ce serait peut-être utile à certains, qui trouvent ce poste lors de la recherche sur le sujet, comme je l'ai fait .:

select ?age where { 
    bind("1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death) 
    bind("1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth) 
    bind(year(?death) - year(?birth) - if(month(?death)<month(?birth) || (month(?death)=month(?birth) && day(?death)<day(?birth)),1,0) as ?age) 
} 
+0

Incroyablement utile! Merci pour la mise à jour. –