按日期查询与按时间查询

时间:2013-03-29 18:55:56

标签: ruby database datetime tire

我认为应用程序代码应该始终将数据库中的时间存储为UTC(如果我错了就打我)

现在假设我要查询2013年3月23日到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,Tire,Ruby(但我认为这无关紧要)

1 个答案:

答案 0 :(得分:1)

实现绝对很重要。根据数据库存储日期/时间值的方式,查询一个或另一个数据库是非常不同的。我建议您编辑您的问题,并使其针对您正在使用的技术。如果可以,请显示一些代码。

总的来说,你混合了两个概念,你应该尝试在心理上将它们分开。

  • 事件发生的那一刻,事件时间可以通过DateTime组合值来衡量 - 表示为UTC,或者是与已知偏移的UTC偏移的值。这通常被称为“瞬时时间”,“世界时间”或“物理时间”。

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

您可以随时查询并使用瞬时时间进行数学运算。这是毫不含糊的。然而,“今天”的概念毫无意义。没有观察者标记一天的结束和下一天的开始。 (有人可能会说观察者在伦敦,但在BST期间并非如此。)

日历时间仅适用于具有日级精度且仅有一个观察者的查询或数学。因此,它通常很难代表一种普遍的东西,比如一个事件。

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

  

我想查询2013年3月23日至2013年3月24日之间的所有内容

就在那里 - 你有问题。背景是什么?你在谈论谁的日历日期?即使你在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 pickerjsTimeZoneDetect

您应该始终以瞬时存储事件。我们只是说你将事件存储为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