【问题标题】:Postgresql jsonb vs datetimePostgresql jsonb vs 日期时间
【发布时间】:2019-06-05 01:11:18
【问题描述】:

我需要存储两个日期valid_from和valid_to。

使用valid_from:datetime 和valid_to:datatime 等两个日期时间字段是否更好。

在jsonb字段有效性存储数据会更好:{"from": "2001-01-01", "to": "2001-02-02"}

读取比写入数据库多得多。 数据库:PostgresSQL 9.4

【问题讨论】:

    标签: postgresql database-design sqldatatypes


    【解决方案1】:

    您可以使用daterange 类型: 即:

    • '[2001-01-01, 2001-02-02]'::daterange 表示从 2001-01-012001-02-02 约束包容
    • '(2001-01-01, 2001-02-05)'::daterange 表示来自2001-01-012001-02-05绑定独家

    还有:

    • 可以使用Infinite等特殊值
    • lower(anyrange) => 范围下限
    • 以及许多其他内容,例如重叠运算符,请参阅文档 ;-)

    Range Type

    【讨论】:

    • id | name | place | validity ----+-----------------------+--------+------------------------- ` 1 | 100% 响应 |顶部 | [2001-01-02,2020-01-01)` 3 |美丽的排版 |顶部 | [2001-01-02,2021-01-01)`如何找到日期2021-01-01包含有效性的行?我需要给定日期为 2021-01-01 的第 3 行。
    • in [2001-01-02,2021-01-01) ==> 2021-01-01 已排除
    • in [2001-01-02,2021-01-01] ==> 包括 2021-01-01
    • validity @> '2021-01-01'::date 选择包含2021-01-01的有效范围
    【解决方案2】:

    使用两个timestamp 列(Postgres 中没有datetime 类型)。

    它们可以有效地被索引并且它们可以保护您免受无效时间戳值的影响 - 没有什么可以阻止您将 "2019-02-31 28:99:00" 存储在 JSON 值中。

    如果您经常需要使用这两个值来检查两者之间是否存在其他 tiemstamp 值,您还可以考虑将两个值存储在单个列中的 range type

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多