SPARQL计算两个日期之间的差异

13

如何计算两个 SPARQL xsd:dateTime 之间的差异?

我找到了 datediff 的参考资料,但它并不能正常工作。SPARQL 中是否存在类似大多数其他查询语言中内置的该功能?


你之前以匿名用户的身份问过这个问题,然后又删除了吗?我敢肯定今天早些时候我回答了一个几乎相同的问题。 - Joshua Taylor
@JoshuaTaylor 我确实问了一个问题,但那只是其中的一部分,不完全是这个问题。这两个问题是不同的,我没有删除它。 - Shamim Hafiz - MSFT
1
好的,只是好奇,因为有一个关于xsd:date减法的问题,以及它们产生持续时间的事实,以及如何获得年数而不是天数。这就是为什么我已经准备好了SPARQL代码。可能只是一个奇怪的巧合。 - Joshua Taylor
2个回答

14

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

对于更具可移植性但可能不太高效的解决方案,您可以使用year从日期时间中提取年份部分。例如,这使您可以执行以下操作:

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

这可能会出现一天的误差,具体取决于两个日期的月份和日期,但是你可以通过使用 monthday 函数来避免这种情况。 这篇文章 描述了这种实现的一些细节。


@KimA.Jakobsen,有很多链接,但我想你指的是第一个。answers.semanticweb.com网站有时会有点不稳定。我希望它不久就能恢复。话虽如此,互联网档案馆/wayback机器在https://web.archive.org/web/20131026044936/http://answers.semanticweb.com/questions/24017/jena-arq-date-diff上有一份副本。 - Joshua Taylor
好的,可能有点太快了,希望网站很快能恢复。谢谢存档页面 :) - Kim Ahlstrøm Meyn Mathiassen

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

非常有用!感谢更新。 - Boudewijn Aasman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接