在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。它以某种方式忽略了时区比较,但当我将该区域放入查询中时,存储会移动时间。当我在系统中有更多的时区时,这将是一个主要的混乱。
有人能对此给出一些建议吗?
发布于 2013-09-27 23:46:37
<rant>是“时区偏移”,而不是“时区”。请使用正确的术语以避免混淆。(但我很好地理解了你的问题) </rant>
最好的建议是在存储数据之前应用偏移量,这样存储在数据库中的值就是UTC。例如,如果你有2013-08-03T22:00:00.000+02:00,你应该存储2013-08-03T20:00:00.000Z。由于偏移量比UTC早两个小时,因此您需要减去两个小时才能回到UTC时间。大多数语言都有一种不需要实际减法操作就能做到这一点的方法,所以请在可用的时候使用它。
当你查询的时候,你也会做同样的事情。在将查询输入传递到筛选器之前,将查询输入规范化到UTC。然后一切都按预期排列好了。
我不熟悉4store,但是很多数据库会自动为你做这种转换。有些甚至允许您将值与原始偏移量一起存储,并且仅在构建索引时进行转换。如果4store有这样的工具,那么你应该使用它们。我查看了文档,没有找到任何关于它如何处理日期的内容。
https://stackoverflow.com/questions/19051927
复制相似问题