我应该如何在SQL中存储日期/时间对象?

时间:2011-08-12 20:48:51

标签: django hibernate time timezone

我已经有这个问题很长一段时间了。问题是这样的:我使用过的大多数SQL服务器(即MySQL)都没有存储带有日期的时区信息,因此我假设它们只是将日期存储为相对于服务器本地时区的日期。如果我必须将服务器迁移到不同的时区,或者如果我创建的服务器分布在不同的数据中心,或者我需要将日期/时间正确地转换为本地值,则会产生一个有趣的问题。

例如,如果我保留2011-08-12 12:00:00 GMT-7之类的日期,则会将其保留为2011-08-12 12:00:00。如果我在特定时间发生了一个世界各地的事件,我必须假设我的服务器在GMT-0700中存储日期,(我们甚至不将夏令时添加到混合中)然后将它们转换为日期,具体取决于每个用户的本地时区。如果我有多个服务器在他们自己的时区存储日期,所有这些都失败了。

对于像Hibernate和Django这样的框架,如果有的话,他们如何处理这个问题呢?我错过了什么,或者这是一个重大问题?

3 个答案:

答案 0 :(得分:4)

我认为,最好的选择是:

  • 将所有时间转换为UTC,并将其存储在数据库中,并将其从UTC进行本地化以显示
  • 在与日期/时间不同的列中存储UTC偏移(以分钟为单位(至少一个现代时区是与UTC偏移的十分钟的倍数)
  • 将时间戳存储为字符串

在我目前的项目中,我们遇到了这个问题(我们使用Postgres)并决定以UTC格式存储所有时间并根据需要在应用程序中进行转换。没有为我们单独存储时区。我们还决定使用时间戳的所有客户端 - 服务器交互都是UTC,并且仅考虑用户交互的本地时区。到目前为止,这已经很好了。

由于您使用Django标记了此问题,我将补充说pytz模块对于处理区域设置时区转换非常有用。

答案 1 :(得分:0)

您对MySQL的回答位于此页面MySQL Server Time Zone Support

基本上,MySQL为使用UTC(时间戳)字段的任何字段提供自动时区支持,但不为没有(日期,时间和日期时间字段)的字段提供自动时区支持。对于UTC字段,您可以使用SET time_zone = timezone;从客户端设置时区。对于nonUTC字段,您必须自己计算。

答案 2 :(得分:0)

你是对的我经常遇到这种情况并倾向于查看TZ并将其存储在静态“VARS”表中,所以至少我可以稍后移动它。

附注:

  • 有趣DATETIME manual甚至没有提及
  • 它受NOW()和CURTIME()的影响,如here
  • 所示

HTH