PostgreSQL中如何用T分隔符格式化时间戳?
问题描述
期望执行以下SQL语句:
SELECT to_char(current_timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DDTHH24-MI-SS')
得到格式为2022-11-11T11-29-51的结果,但实际输出不符合预期。尝试了多种写法:
SELECT to_char(current_timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DDTHH24-MI-SS') as plain, to_char(current_timestamp AT TIME ZONE 'UTC', E'YYYY-MM-DD\'T\'HH24-MI-SS') as with_quotes, to_char(current_timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DD\THH24-MI-SS') as with_backslash, to_char(current_timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DDT HH24-MI-SS') as with_space
但都无法得到目标格式,T被解析为模式的一部分而被忽略,如何实现预期输出?
解决方案
在PostgreSQL的to_char函数中,要保留固定的文本字符(比如这里的T),需要用双引号将其包裹,明确标记这是不需要解析的固定内容。
正确的SQL语句如下:
SELECT to_char(current_timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24-MI-SS');
如果你的模式字符串本身包含单引号,也可以使用美元引号($$)来避免转义问题,写法如下:
SELECT to_char(current_timestamp AT TIME ZONE 'UTC', $$YYYY-MM-DD"T"HH24-MI-SS$$);
原因说明
- 直接写
T时,PostgreSQL会将其视为日期/时间格式模式的一部分,但T并不是有效的格式符,因此会被直接忽略,导致输出中缺失T。 - 你尝试的单引号转义写法(
E'YYYY-MM-DD\'T\'HH24-MI-SS')无效,因为to_char的模式字符串中,单引号需要用两个连续单引号转义,而非反斜杠(反斜杠转义仅在特定字符串设置下生效,不推荐依赖)。 - 反斜杠转义
T的写法同样不被to_char的解析逻辑支持,无法保留T。
内容的提问来源于stack exchange,提问作者Vladislav Varslavans
相关产品推荐
相关产品推荐

