sql - 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;
^
我知道如何缓解这个问题。在这里,我只想了解它为什么会这样。
解决方案
回答我自己的问题。看起来 Postgres 只是通过以下方式解析文本:
{"minutes": 20, "hours":10}
20
紧随其后,hours
因此变为20 hours
。10
后面没有任何东西,所以它变成10 seconds
. 最终结果是20:00:10
。
另一个例子:
select '{hours 20 !!!!! d 10 ::: s}'::interval;
20
紧随其后d
成为20 days
。10
紧随其后s
成为10 seconds
。最终结果是20 days 00:00:10
。
推荐阅读
- python - How to optimize my pandas data frame pre-processing?
- c# - ParallelProcess 无限期阻塞 Task.WaitAll 随机,大部分时间处理正常
- react-native - React-native-map 在放大某些位置时显示空白地图
- javascript - 如何在Javascript中实现关闭字符串中开尖括号`<`的逻辑
- wpf - wpf 文本框不会抛出 textInput 事件
- solr - 如何将条件或过滤器添加到自动建议的 solr 术语查询
- java - 如何在 Java 中本地触发现有的 AWS lambda?
- css - 如何在 vuetify v2 中更改 scss 中的断点?
- c++ - 如何在 Eigen 中编写以下 Matlab 代码:vec(1:n) = vec(idx)?
- excel - 如果单元格为空,则复制上面的整行并插入到空单元格的行中