2013-03-29 181 views
0

我认为应用程序代码应在数据库中存储时始终为UTC(冲我,如果我错了)查询日期VS查询的时间

现在可以说,我想查询23-MAR-2013之间的一切2013年3月24日。我应该创建一个时间对象,然后查询诸如“23-mar-2013:00:00:00UTC”到“24-mar-2013:24:00:00UTC”或按日期查询是正确的“23-mar- 2013“改为”2013年3月24日“。

现在问题出现在我不在UTC和时区像-7:30。

现在日期查询会出问题..

这是否意味着我应该随时间总是查询?

我说在关系到ElasticSearch,轮胎,红宝石(但我认为不应该的问题)

+0

好吧.. ***打孔***。更新您的标签以包含您正在使用的系统。 – Kermit

+0

@PolishPrince我认为这个问题并不涉及系统,而是更多的一般查询......为什么在UTC以外的地方存储时间呢? –

+0

我读过你的陈述,数据库应该以UTC存储时间。 – Kermit

回答

1

实施压根就问题。根据数据库如何存储日期/时间值,查询一个数据库或另一个数据库是非常不同的。我建议你编辑你的问题,并针对你正在使用的技术制定具体的问题。如果可以,请显示一些代码。

一般来说,你在混合两个概念,你应该尝试在精神上区分它们。

  • 的瞬间发生了什么事情,事件时间,可以通过一个DateTime组合值来测量 - 表示为任一UTC,或作为从UTC其中已知所述偏移补偿的值。这通常被称为“即时时间”,“世界时间”或“物理时间”。

  • 我们在本地谈论日期和时间时给出的值,如“今日”,“昨日”或“2013年3月29日”。即使我们有时间,我们也正在谈论日历中的一小部分时间。这通常被称为“日历时间”,“当地时间”或“民用时间”。

你可以随时查询和用瞬时时间做数学。这是毫不含糊的。但是,“今日”的概念是没有意义的。没有观察员可以标记一天的结束和下一天的开始。 (有人可能认为观察者在伦敦,但在BST期间并不是这样。)

日历时间仅适用于查询或数学运算,当您具有一天的精度并且只有一个观察者时。所以它通常会让一个普遍意义上的事物表现不佳,就像一个事件。

让我们回到原来的问题。你说:

我想23-MAR-2013之间查询一切24-MAR-2013

就在那里 - 你有问题。什么是上下文?你在谈论谁是日历日期?即使你说3月23日,你可能不是指3月23日午夜UTC到3月24日午夜UTC。你可能是指一些其他日历的中午。

请记住,不是每天都是24小时的长度。当时区打开和关闭夏令时(或夏令时)时,天数可能为23小时或25小时。

那该怎么办?首先,您需要一个时区数据库(例如IANA/Olson/TZ/TZDB/ZoneInfo数据库)Here is one implemented in Ruby

现在,您需要了解用户的本地时区。那就是 - 提问你正在显示查询结果的人。这将涉及您自己的应用程序逻辑,可能是选择器或选择器。如果这是一个网络应用,你可能想看看this map-based timezone picker,或jsTimeZoneDetect

您应该始终使用瞬间时间存储事件。让我们只是说你将事件存储为UTC(尽管你可能使用偏移量,但现在我们将忽略它)。

因此,您需要知道用户想要的日期范围,查询地图的开始日期和结束日期的UTC时间为?例如,假设我们在印度使用Asia/Calcutta时区。我们会将23-mar-2013 00:00 - 24-mar-2013 00:00转换为UTC等效的22-mar-2013 18:30 - 23-mar-2013 18:30

然后,您可以使用这些UTC DateTime值来查询数据库。

将结果返回给用户时,您可能需要将UTC转换回当地时间,以便他们了解他们正在查看的结果。

您还应该阅读许多伟大的建议in this post