在Postgres中,我正在try 将以下文本解析为timestamp with timezone:

2023-08-09T23:39:18.832Z

以下内容:

select TO_TIMESTAMP('2023-08-09T23:39:18.832Z', 'YYYY-MM-DD"T"HH24:MI:SS.USSTZ');

看起来确实奏效了.然而,我不确定最后的".USSTZ"是什么意思.

我正在看文件:

https://www.postgresql.org/docs/current/functions-formatting.html#FUNCTIONS-FORMATTING-DATETIME-TABLE

上面说US代表microsecond.我还是不明白剩下的"STZ"是什么意思?

推荐答案

格式中的S个字符的数量与时间戳格式可以接受的占位符的可能数量有关.这些都是有效的值:

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.832244', 'YYYY-MM-DD"T"HH24:MI:SS.USTZ');
         to_timestamp          
-------------------------------
 2023-08-09 23:39:18.832244+00
(1 row)

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.832244', 'YYYY-MM-DD"T"HH24:MI:SS.USSSTZ');
         to_timestamp          
-------------------------------
 2023-08-09 23:39:18.832244+00
(1 row)

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.832244', 'YYYY-MM-DD"T"HH24:MI:SS.USSSSTZ');
         to_timestamp          
-------------------------------
 2023-08-09 23:39:18.832244+00
(1 row)

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.832244', 'YYYY-MM-DD"T"HH24:MI:SS.USSSSSTZ');
         to_timestamp          
-------------------------------
 2023-08-09 23:39:18.832244+00

如果你在小数点后没有足够的数字,它会抱怨:

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.83', 'YYYY-MM-DD"T"HH24:MI:SS.USSSTZ');
ERROR:  source string too short for "US" formatting field
DETAIL:  Field requires 6 characters, but only 2 remain.
HINT:  If your source string is not fixed-width, try using the "FM" modifier.
postgres=# 

TZ表示输出应追加配置的时区UTC偏移量

要使用FM前缀,只需将其放在US部分之前:

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.83', 'YYYY-MM-DD"T"HH24:MI:SS.FMUSSSTZ');
       to_timestamp        
---------------------------
 2023-08-09 23:39:18.83+00
(1 row)

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.83', 'YYYY-MM-DD"T"HH24:MI:SS.FMUSSSSSTZ');
       to_timestamp        
---------------------------
 2023-08-09 23:39:18.83+00
(1 row)

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.83', 'YYYY-MM-DD"T"HH24:MI:SS.FMUSSSSSSTZ');
       to_timestamp        
---------------------------
 2023-08-09 23:39:18.83+00
(1 row)

postgres=# select TO_TIMESTAMP('2023-08-09T23:39:18.834567', 'YYYY-MM-DD"T"HH24:MI:SS.FMUSSTZ');
         to_timestamp          
-------------------------------
 2023-08-09 23:39:18.834567+00
(1 row)

Sql相关问答推荐

如何在PostgreSQL中同时为id s列表执行多个update语句?'

如何从多行数据中获取一行合并数据?

有没有办法在每次计算每一行的数据时更新2个值?

SQL:如何取上一年的平均值?

按日期时间(不包括秒)连接表

使用DatePart函数对日期时间值进行分组

snowflake/SQL嵌套的JSON对象和数组

Oracle 23c ROUND,数据类型为DATE

在SELECT中将日期格式转换为双周时段

提取连续时间戳范围的SQL

统计PostgreSQL中前10个最大大小表的行数

在 postgres 中插入或更新 jsonb 数组的对象

在 R 值的 SQL 块中显示值

错误:postgresql 中缺少表评级的 FROM 子句条目

根据潜在空值的条件对记录进行计数

使用in和and运算符过滤记录的条件

从 varchar 列中删除特殊字符后的前面的零和字符时遇到问题

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

如何在 PL/SQL 中区分返回的 XML 值?

如何计算每行出现的次数并显示在另一个表中?