3

我想使用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 时间戳,但是解码器如何知道该值应该解码为 date 或 datetime 而不是 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”。

你对这件事怎么看?

4

2 回答 2

5

唉,json 对 dates 一无所知

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

于 2012-12-10T12:54:31.117 回答
1

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

请参阅帖子如何使用新 PostgreSQL JSON 数据类型中的字段进行查询?为线程。

于 2012-12-10T13:57:33.057 回答