gpt4 book ai didi

postgresql - 为什么这里的默认格式不同? (ISO 8601 的两种不同实现方式)

转载 作者:行者123 更新时间:2023-12-05 02:27:43 25 4
gpt4 key购买 nike

在 jsonb 中存储时间戳时,我意识到将 current_timestamp 和 now() 放入 jsonb 时使用的格式与我直接使用它们时使用的格式不同。这里发生了什么?虽然两者都是 ISO8601 格式,但我更希望它们都使用相同的格式。为什么有两个不同的默认值?

select version();
select now();
select current_timestamp;
select jsonb_build_object('timestamptz', current_timestamp);
select jsonb_build_object('timestamptz', now());
| version                                                                                                || :----------------------------------------------------------------------------------------------------- || PostgreSQL 12.9 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4), 64-bit || now                           || :---------------------------- || 2022-07-14 14:13:42.696612+01 || current_timestamp             || :---------------------------- || 2022-07-14 14:13:42.696612+01 || jsonb_build_object                                  || :-------------------------------------------------- || {"timestamptz": "2022-07-14T14:13:42.696612+01:00"} || jsonb_build_object                                  || :-------------------------------------------------- || {"timestamptz": "2022-07-14T14:13:42.696612+01:00"} |

db<> fiddle here

最佳答案

时间戳文字的格式(以及时间戳到字符串的默认转换)在 ISO/IEC 9075-2:2016 (SQL:2016) 第 5.3 节 中定义为有一个空格作为日期和时间之间的分隔符:

<timestamp literal> ::=
TIMESTAMP <timestamp string>

<timestamp string> ::=
<quote> <unquoted timestamp string> <quote>

<unquoted timestamp string> ::=
<unquoted date string> <space> <unquoted time string>

两者都是 <unquoted date string><unquoted time string>遵循 ISO-8601 的格式。

因此,为了符合标准、互操作性和向后兼容,必须在 SQL 本身中使用这种格式。

很可能,当 PostgreSQL 添加 JSON 时,SQL 标准的这个历史包袱被遗漏了,取而代之的是遵循 ISO-8601,因为许多其他 JSON 序列化解决方案也使用它,这导致使用 T作为分隔符。

关于postgresql - 为什么这里的默认格式不同? (ISO 8601 的两种不同实现方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72985176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com