2

我在过滤两个时间过滤器(包括 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)

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

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

4

1 回答 1

-1

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

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

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

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

于 2013-09-27T15:46:37.080 回答