将文本转换为UTC时间戳

时间:2019-07-10 11:07:44

标签: postgresql

我的表中有文本格式的时间戳。格式为2019-05-30T05:48:29.095705642+01:00。我想将其转换为UTC时间戳。

我正在考虑先将文本转换为时间戳,然后将其转换为UTC。我正在执行SELECT TO_TIMESTAMP('2019-05-30T05:48:29.095705642+01:00', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'),但是不起作用。我无法弄清楚。

1 个答案:

答案 0 :(得分:1)

对于毫秒(.MS),您只能使用3个十进制数字。如果您改用.US,则可以转换6位数字。

但是,如果您不想在单独的操作中剥离数字(并且如果您确定总会有3位数字),则可以通过添加9模式(US999)来忽略它们。结果将与使用之前剥离的结果相同。

documentation (table 9.26)

SELECT 
    TO_TIMESTAMP(
        '2019-05-30T05:48:29.095705642+01:00', 
        'YYYY-MM-DD"T"HH24:MI:SS.US999"Z"'
     )


但是,最简单的方法(如果您确实有此日期格式)是直接转换为timestamptz。 PostgreSQL为您解决了难题,无需考虑小数位数:

SELECT '2019-05-30T05:48:29.095705642+01:00'::timestamptz

从文本转换为时间戳后,您可以使用at time zone 'UTC'切换时区:

SELECT '2019-05-30T05:48:29.095705642+01:00'::timestamptz at time zone 'UTC'

demo:db<>fiddle


如注释中所述:时区未正确考虑。 "Z"仅忽略字母Z。要解析时区,您需要编写TZH:TZM。您只是应该使用PostgreSQL魔术的另一个原因。