将 ISO8601 日期文本转换为时间戳

Casting ISO8601 date text to Timestamp

我正在处理 ISO 8601 中的一些日期,当转换为时间戳时,我在毫秒内遇到了一些奇怪的情况:

SELECT '2020-05-15T19:01:59.002+00:00'::timestamp
2020-05-15 19:01:59:02 <--- wrong milliseconds

SELECT '2020-05-15T19:01:59.022+00:00'::timestamp
2020-05-15 19:01:59:22 <--- wrong milliseconds

SELECT '2020-05-15T19:01:59.22+00:00'::timestamp
2020-05-15 19:01:59:220 <--- ok, but I'm scared

我尝试使用 to_timestamp() 但找不到解决字符串中 T 的方法。任何指导表示赞赏!

从您用于访问 Postgres 的任何技术来看,您所看到的似乎只是一个人工制品。如图所示 in this demo,实际上您对时间戳的转换工作正常。考虑以下因素:

WITH yourTable AS (
    SELECT '2020-05-15T19:01:59.002+00:00'::timestamp AS ts
)

SELECT
    ts,
    EXTRACT(milliseconds FROM ts) AS millis
FROM yourTable;

上述查询正确生成 59,002 作为时间戳中的毫秒数。