首页 > 解决方案 > PostgreSQL - 将 JSON 字符串转换为 INTERVAL 返回不正确的值

问题描述

将 JSON 字符串转换为 INTERVAL 类型时,我在 Postgres 服务器上观察到一种奇怪的行为。我在 Postgres v9、v10、v11 上进行了尝试,并得到了相同的结果。

例子:

select '{"minutes": 20, "hours":10}'::interval;

+----------+
| interval |
+----------+
| 20:00:10 |
+----------+
(1 row)

没有错误,警告,什么都没有。Postgres 不会抱怨,但会返回错误的结果。为什么它会这样?

另一方面,这些示例返回错误:

select '{}'::interval;

ERROR:  invalid input syntax for type interval: "{}"
LINE 1: select '{}'::interval;
               ^

select '{"blahblah": 10}'::interval;

ERROR:  invalid input syntax for type interval: "{"blahblah": 10}"
LINE 1: select '{"blahblah": 10}'::interval;
               ^

我知道如何缓解这个问题。在这里,我只想了解它为什么会这样。

标签: sqlpostgresqlcasting

解决方案


回答我自己的问题。看起来 Postgres 只是通过以下方式解析文本:

{"minutes": 20, "hours":10}

20紧随其后,hours因此变为20 hours10后面没有任何东西,所以它变成10 seconds. 最终结果是20:00:10

另一个例子: select '{hours 20 !!!!! d 10 ::: s}'::interval;

20紧随其后d成为20 days10紧随其后s成为10 seconds。最终结果是20 days 00:00:10


推荐阅读