【问题标题】:SPARQL Calculating the difference between two dateSPARQL 计算两个日期之间的差异
【发布时间】:2013-09-03 22:04:49
【问题描述】:

计算两个 SPARQL xsd:dateTime 之间差异的函数是什么?

我找到了对 datediff 的引用,但这不起作用。 SPARQL 中是否存在与大多数其他查询语言一样的内置函数?

【问题讨论】:

  • 您之前是不是以匿名用户的身份问过这个问题,然后删除了它?我可以发誓我今天早些时候回答了一个几乎相同的问题。
  • @JoshuaTaylor 我确实问了一个问题,但那是问题的一部分,而不是这个问题。两个问题不同,我没删。
  • 好吧,只是好奇,因为有一个关于 xsd:dates 减法的问题,以及它们产生持续时间的事实,以及如何获得年数。这就是我准备好 SPARQL 代码的原因。也许只是一个奇怪的巧合。

标签: date sparql


【解决方案1】:

一些 SPARQL 引擎可能直接支持日期算术。例如,正如this answers.semanticweb.com question and answer 中提到的,Jena 支持日期算术,您可以从另一个日期中减去一个日期并获得 xsd:Duration。其他实现可能支持 datediff 函数。例如,this Virtuoso example 包括使用 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  |
-------

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

【讨论】:

  • @KimA.Jakobsen 有很多链接,但我假设您的意思是第一个。 answers.semanticweb.com 网站有时有点不稳定。我希望它很快就会恢复。也就是说,互联网存档/wayback 机器在web.archive.org/web/20131026044936/http://… 有一个副本。
  • 好的,可能有点太快了,我家网站很快就会恢复。感谢存档页面:)
【解决方案2】:

我在搜索如何在 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 )
}

【讨论】:

  • 非常有用!感谢更新。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 2021-11-25
  • 2011-08-01
  • 1970-01-01
  • 2013-08-20
  • 2011-05-21
相关资源
最近更新 更多