12

What is the function to calculate difference between two SPARQL xsd:dateTime ?

I have found a reference to datediff, but this is not working. Does such a built in function exist in SPARQL as it does with most other query languages?

4

2 回答 2

14

一些 SPARQL 引擎可能直接支持日期算术。例如,正如answers.semanticweb.com question and answer中提到的,Jena 支持日期算术,您可以从另一个日期中减去一个日期并获得 xsd:Duration。其他实现可能支持 datediff 函数。例如,这个 Virtuoso 示例包括使用 bif:datediff。但是,这些是扩展,并不保证会出现在任何特定的 SPARQL 实现中。

对于更便携但可能效率较低的解决方案,您可以使用年份从日期时间中提取年份部分。例如,这可以让你做,

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

并得到结果

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

根据两个日期的月份和日期,这可能会减少一,但您可以通过使用月份日期函数类似地解决此问题。 该线程描述了一些此类实现。

于 2013-09-04T02:10:23.003 回答
9

我在搜索如何在 SPARQL 中计算年龄时发现了这篇文章。感谢 Joshua Taylor 提供正确的提示。但是,我通过添加调整来改进代码段,因此如果该人在他们去世的那一年没有过生日,则它不会减少一年。我认为它可能对某些人有用,他们在搜索主题时会发现这篇文章,就像我一样:

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 )
}
于 2016-05-09T08:34:14.160 回答