我在使用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
。它以某种方式忽略了时区比较,但是当我将区域放入查询时,商店会改变时间。当我在系统中有更多时区时,这将是一个很大的混乱。
有人可以就此提出一些建议吗?
答案 0 :(得分:-1)
<rant>
那是“时区偏移”,而不是“时区”。请使用正确的术语以避免混淆。 (但我理解你的问题很好。)
</rant>
最好的建议是在存储数据之前应用偏移量,以便存储在数据库中的值为UTC。例如,如果您有2013-08-03T22:00:00.000+02:00
,则会存储2013-08-03T20:00:00.000Z
。由于偏移比UTC早两个小时,因此减去两个小时才能回到UTC时间。大多数语言都有办法在没有实际减法操作的情况下执行此操作,因此在可用时使用它。
当你查询时,你会做同样的事情。在将查询输入传递给过滤器之前,将其标准化为UTC。然后一切都按照需要排列。
我不熟悉4store,但很多数据库会自动为您进行这种转换。有些甚至会让您使用原始偏移量存储值,并且仅在构建索引时进行转换。如果4store有这方面的设施,那么你应该使用它们。我检查了文档,没有找到任何关于如何处理日期的方法。