如何计算两个 SPARQL xsd:dateTime 之间的差异?
我找到了 datediff 的参考资料,但它并不能正常工作。SPARQL 中是否存在类似大多数其他查询语言中内置的该功能?
如何计算两个 SPARQL xsd:dateTime 之间的差异?
我找到了 datediff 的参考资料,但它并不能正常工作。SPARQL 中是否存在类似大多数其他查询语言中内置的该功能?
一些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 |
-------
这可能会出现一天的误差,具体取决于两个日期的月份和日期,但是你可以通过使用 month 和 day 函数来避免这种情况。 这篇文章 描述了这种实现的一些细节。
在我搜索如何在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 )
}