Postgresql to_char 将字符添加到日期

Posted

技术标签:

【中文标题】Postgresql to_char 将字符添加到日期【英文标题】:Postgresql to_char add characters to date 【发布时间】:2018-11-04 14:53:17 【问题描述】:

我想选择这种格式的日期: 2018-11-25T16:00:00Z

所以我尝试这样做:

select to_char(registration_date, 'YYYY-MM-DDTHH24:MI:SSZ')
from ...

但它的输出是:

2018-11-01STH24:17:35Z 

char 'T' 改变了日期输出,而不是仅仅在中间打印。我试图像这样在字符“T”旁边添加空格:

select to_char(registration_date, 'YYYY-MM-DDT HH24:MI:SSZ')

它有效,但我需要不带空格的日期。

如何将字符'T'添加到日期的中间,并且输出与第一个示例相同?

【问题讨论】:

【参考方案1】:

是的,这真的很有趣。我可以重现它:

SELECT to_char('2018-11-01 15:21:24'::timestamp, 'YYYY-MM-DDTHH24:MI:SSZ')

给予

2018-11-01STH24:21:24Z  -- note the S

还有

SELECT to_char('2018-11-04 15:21:24'::timestamp, 'YYYY-MM-DDTHH24:MI:SSZ')

给了

2018-11-04THH24:21:24Z -- note that THH still seems to remain as in the format string

这里的问题是格式值TH。该字符串被解释为“序数后缀”。它为“第一”、“第二”、“第三”、“第四”等添加了后缀“ST”、“ND”、“RD”和“TH”。在您的格式字符串中,这是由您的 T 和格式字符串 HH24 组合而成的。

见:

SELECT to_char('2018-11-01 15:21:24'::timestamp, 'YYYY-MM-DDTH')

给予

2018-11-01ST 

SELECT to_char('2018-11-04 15:21:24'::timestamp, 'YYYY-MM-DDTH')

给予

2018-11-04TH

所以实际上你上面的例子是可以解释的。 S 实际上是 STH24THH24 的未解释其余部分(其中 TH 已经被用作序数后缀)。与第二个示例相同,其中TH 再次转换为TH,因此它似乎被忽略了。


您的解决方案是将 T 放在双引号中:

SELECT to_char('2018-11-01 15:21:24'::timestamp, 'YYYY-MM-DD"T"HH24:MI:SSZ')

给出:

2018-11-01T15:21:24Z

demo:db<>fiddle

Postgres date formatting

【讨论】:

以上是关于Postgresql to_char 将字符添加到日期的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL在转换后将字符误解为数字

Postgresql/Greenplum中将数字转换为字符串TO_CHAR函数前面会多出一个空格

PostgreSQL中有以下格式化函数:

[PostgreSQL]PostgreSQL数据类型格式化函数——字符串和数值间的转换

使用 to_char 在查询中转换时间

PostgreSQL TO_CHAR() 删除月份字段的填充