【问题标题】:How to store a date in postgresql "json" datatype for use with plv8?如何在 postgresql“json”数据类型中存储日期以用于 plv8?
【发布时间】:2012-12-10 10:58:35
【问题描述】:

我想使用 Date.UTC 在 postgresql 9.2 "json" 字段中存储日期和日期时间,但它当然失败了:

hp=> update formapp_record set data='{"dt": Date.UTC(120, 10, 2)}' where id=17;
ERROR:  invalid input syntax for type json
LINE 1: update formapp_record set data='{"dt": Date.UTC(120, 10, 2)}...
                                       ^
DETAIL:  Token "Date" is invalid.
CONTEXT:  JSON data, line 1: {"dt": Date...

可以直接存储 UTC 时间戳,但是解码器怎么知道该值应该解码为日期或日期时间而不是 int 呢?

也可以将 Date.UTC 调用存储为字符串:

update formapp_record set data='{"dt": "Date.UTC(120, 10, 2)"}' where id=17;

虽然可行,但它需要 0. 检查字符串是否以 Date.UTC 开头和 1. 在 plv8 中使用 eval

一种解决方案是存储一些元数据,例如:

update formapp_record set data='{"dt": {"_type": "date", "_value": [120, 10, 2]}}' where id=17;

但这不是很“标准”,甚至是“hackish”。

你对这件事有什么看法?

【问题讨论】:

    标签: sql json postgresql datetime


    【解决方案1】:

    唉,json doesn't know anything about dates

    我会将 ISO 8601 日期存储为字符串。是的,这是一种痛苦。是的,这意味着没有很好的标准方式来区分“这是一个日期”与“这是一个字符串”。不过,IMO 与大多数其他选项相比,它没有那么痛苦。

    【讨论】:

    • 应该加前缀吗?像值:'_date:' ?
    • @jpic 这在很大程度上取决于消费应用程序。许多消费者会识别并转换 ISO 8601 日期或时间戳,并且会被前缀混淆。
    【解决方案2】:

    一种可能的解决方案是使用 Postgres 的 row_to_json 函数,并将您的日期存储为时间戳,并根据需要将它们提取到 json 中。但是,Tobe Hede 写了一些 json functions for Postgres 可能会有所帮助,并且似乎比 Postgres 为 9.2 提供的 2 个原生选项更完整

    请参阅帖子How do I query using fields inside the new PostgreSQL JSON datatype? 了解该主题。

    【讨论】:

      猜你喜欢
      • 2023-01-09
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多