【问题标题】:What is the ideal way to store a timezones aware in a PostgreSQL database?在 PostgreSQL 数据库中存储时区感知的理想方法是什么?
【发布时间】:2019-05-26 14:46:21
【问题描述】:

我想在我的 SQL 数据库中存储日期时间字符串。其中一些可能是时区感知的。我有 3 种存储方式:

  1. 将它们存储为不带时区的字符串,例如'1995-01-13 12:41:04.231132',并将时区偏移量'+0000' 存储在单独的列中。

  2. 将它们存储为不带时区的字符串,例如'1995-01-13 12:41:04.231132',并将时区名称'Africa/Cairo' 存储在单独的列中。

  3. 将整个内容存储为字符串:'1995-01-13 12:41:04.231132+0000',并附加偏移量。

理想的方法是什么?

注意:我使用的是 PostgreSQL 数据库。

额外细节:事实上,我将这些日期时间存储在我的 PostgreSQL 数据库中的 JSONB 列中,因此在查询和排序期间,我需要使用适当的数据类型转换它们。

【问题讨论】:

  • 这真的取决于你的需要。这些是过去事件的时间戳吗?或者您正在安排未来或经常性的活动?你有各种不同的时区吗?还是来自一个时区的所有数据?知道等效的 UTC 就足够了,还是需要原始本地时间?另请参阅 the timezone tag wikibest practices 列表。

标签: sql postgresql datetime timezone


【解决方案1】:

以上都不是,使用timestamp with time zone 数据类型。它可以将时区信息处理为偏移量、时区名称或缩写。

【讨论】:

  • 我添加了一个额外的注释,但你能给我这个时间戳的格式吗?我只看到官方文档中使用了偏移量。
  • Heres 文档中的时区表。在此表上方的时间部分以及下面的时间戳部分中,示例比比皆是
  • 谢谢,我明白了。我在额外注释下添加了对问题的编辑。你知道存储为时间戳的日期是否可以用于订购?我在这里没找到:postgresql.org/docs/current/functions-json.html.
  • 时间戳可以按原样排序,无需将它们转换为不同的数据类型。这是将日期和时间存储在适当的数据类型中而不是将它们存储为字符串的优点之一(只有一个),这在很大程度上被认为是一个坏主意。
  • 我在问题中特别提到它存储在 JSONB 列中。
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2015-07-10
  • 2011-12-10
  • 2010-09-14
相关资源
最近更新 更多