【问题标题】:Storing dates in postgresql arrays在 postgresql 数组中存储日期
【发布时间】:2016-03-08 14:09:39
【问题描述】:

我有一个大型的以人为本的历史数据集,其中包括以 YYYY、YYYY-MM 或 YYYY-MM-DD 格式记录的出生日期。我一直在想我应该为这个字段使用一个 date[] 数组,因为数据集经常列出两个或多个出生日期。

PG docs 说支持 ISO 8601 日期,并且 ISO 8601 (wikipedia link) 适应降低的精度,但 PG 不允许我添加降低精度的日期(例如 1882 年 11 月的 1882-11)。

那么,处理需要包含多个出生日期(可能看起来像 1883、1882-11 或 1882-12-12)的记录的最佳方法是什么?

【问题讨论】:

  • 如果我理解正确当你保存1883 postgres 保存1883-01-01?
  • 没有。它返回一个数据类型错误并且不插入任何内容。问题是(我认为)PG 不允许降低精度的 ISO 8601 日期,尽管我想证明是错误的:)
  • 假设 Pg 不支持这个,这是一个非常糟糕的解决方法,但我会创建三个数组字段,一个 smallint 数组和两个日期数组,分别命名为 bday_year、bday_month、bday_date。这样,即使您在 bday_year 中看到 1997-05-01,您也知道它并不表示 5/1/1997,它仅表示 5/1997。我意识到这远非理想,但它会让你从 A 点到 B 点。

标签: postgresql date datetime


【解决方案1】:

假设你有一张桌子person

+----------------+---------+----------+--------------------------------+
|      person_id |  fname  |  lname   |             bdate[]            |
+----------------+---------+----------+--------------------------------+
|              1 |  'Jhon' |  'Smith' | {1883, 1882-11, or 1882-12-12} |
+----------------+---------+----------+--------------------------------+

你不希望这样,因为那样很难搜索一个日期或更新数组。

相反,您想要一张额外的桌子birthdays

+-------------+------+------------+
| birthday_id | type |   bdate    |
+-------------+------+------------+
|           1 |    1 | 1883-01-01 |
|           1 |    2 | 1882-11-01 |
|           1 |    3 | 1882-12-12 |
+-------------+------+------------+

这种方式即使保存日期1883-01-01,你也知道会是type = 11883

【讨论】:

  • 作为解决方案存在一些问题,但最严重的问题是您将出生日期编为一月一号。数据仅提供出生年份(1883 年)。我确实需要能够存储降低精度的日期(根据 ISO 8601 规范)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2018-02-09
  • 2021-12-29
  • 2019-12-22
  • 2017-12-07
相关资源
最近更新 更多