4Store时区过滤器不准确

时间:2013-09-27 13:24:42

标签: datetime timezone rdf sparql 4store

我在使用4Store中包含时区的两个时间过滤器之间过滤记录时遇到问题。我的记录目前大多位于+02:00时区,并且是xsd:dateTime类型。

当我尝试这样的过滤器时:

FILTER (?time >= xsd:dateTime('2013-08-02T01:00:00.000+02:00') && ?time <=
xsd:dateTime('2013-08-03T22:00:00.000+02:00'))

FILTER (?time >= "2013-08-02T01:00:00.000+02:00"^^xsd:dateTime &&
?time <= "2013-08-03T22:00:00.000+02:00"^^xsd:dateTime)

数据库将这些时间移动到时区数量,然后将它们字面上与数据库中的时间进行比较,忽略它们的时区。这意味着,当我想要示例中范围的时间时,我必须删除时区,或者放置Z+00:00。当我阅读时间时,它们被正确写入,其时区为+02:00。它以某种方式忽略了时区比较,但是当我将区域放入查询时,商店会改变时间。当我在系统中有更多时区时,这将是一个很大的混乱。

有人可以就此提出一些建议吗?

1 个答案:

答案 0 :(得分:-1)

<rant> 那是“时区偏移”,而不是“时区”。请使用正确的术语以避免混淆。 (但我理解你的问题很好。) </rant>

最好的建议是在存储数据之前应用偏移量,以便存储在数据库中的值为UTC。例如,如果您有2013-08-03T22:00:00.000+02:00,则会存储2013-08-03T20:00:00.000Z。由于偏移比UTC早两个小时,因此减去两个小时才能回到UTC时间。大多数语言都有办法在没有实际减法操作的情况下执行此操作,因此在可用时使用它。

当你查询时,你会做同样的事情。在将查询输入传递给过滤器之前,将其标准化为UTC。然后一切都按照需要排列。

我不熟悉4store,但很多数据库会自动为您进行这种转换。有些甚至会让您使用原始偏移量存储值,并且仅在构建索引时进行转换。如果4store有这方面的设施,那么你应该使用它们。我检查了文档,没有找到任何关于如何处理日期的方法。