实施压根就问题。根据数据库如何存储日期/时间值,查询一个数据库或另一个数据库是非常不同的。我建议你编辑你的问题,并针对你正在使用的技术制定具体的问题。如果可以,请显示一些代码。
一般来说,你在混合两个概念,你应该尝试在精神上区分它们。
你可以随时查询和用瞬时时间做数学。这是毫不含糊的。但是,“今日”的概念是没有意义的。没有观察员可以标记一天的结束和下一天的开始。 (有人可能认为观察者在伦敦,但在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。
好吧.. ***打孔***。更新您的标签以包含您正在使用的系统。 – Kermit
@PolishPrince我认为这个问题并不涉及系统,而是更多的一般查询......为什么在UTC以外的地方存储时间呢? –
我读过你的陈述,数据库应该以UTC存储时间。 – Kermit