【问题标题】:4Store time zone filter not accurate4Store时区过滤器不准确
【发布时间】:2013-09-27 13:24:42
【问题描述】:

我在过滤两个时间过滤器(包括 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。它以某种方式忽略了时区比较,但是当我将时区放在查询中时,商店会改变时间。当我在系统中有更多时区时,这将是一个主要的混乱。

任何人都可以就此提供一些建议吗?

【问题讨论】:

  • 数据中的值是什么?您能否显示(部分数据)您希望返回的信息?
  • 会的,我现在没有它 :)

标签: datetime timezone rdf sparql 4store


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不想将时间标准化为 UTC,因为我想保留时区偏移量。例如,它用于解决事件发生在白天还是晚上。尽管看起来很愚蠢,但时区与其他所有数据一样都是有效数据,我不想破坏它。特别是因为 4Store 应该启用包含时区的查询(绝对比较是之前或之后的东西,无论偏移量如何)。对不起,表达方式,地区差异:)。我不是那个投反对票的人:)。
  • 明白。这将取决于 4Store 是否可以为您转换为 UTC。就像我说的,其他数据库这样做,但它必须得到本机支持。如果 4Store 只是将原始字符串存储和索引,那么你就不走运了。一种想法是存储字段 两次 - 一次使用其原始偏移量,一次使用归一化为 UTC 的偏移量。
  • 它确实比较日期,所以它不是一个常规字符串。问题是比较偏离了规范。
  • 我已经在 4Store、RDF 和 SPARQL 的各种文档中挖掘了几个小时,但我找不到任何描述在存储或索引期间如何操作 xsd:dateTime 的地方。我认为它存储了你给它的任何东西。如果您能指出我另有说明的地方,请这样做。
  • 我也多次重读您的问题,措辞令人困惑。在问题的一部分中,您说它正在改变比较值,在另一部分中,您说它被忽略了。它是哪一个?难道你不想要它转移比较?否则,您谈论的不是同一时刻。也许我只是误解了你在问什么。请编辑您的问题,以包括您最初存储到数据库中的内容、4Store 如何存储它、您如何看待它的变化、您的期望以及任何其他可以使其更清晰的内容。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 2016-05-30
  • 2014-07-17
  • 1970-01-01
  • 2014-11-25
  • 2011-02-19
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多