【问题标题】:PostgreSQL convert date with timezone to a timestampPostgreSQL 将带时区的日期转换为时间戳
【发布时间】:2023-03-28 16:15:01
【问题描述】:

我在我的 psql 数据库中以 DD/MM/YYYY HH24:MI TZ(带时区的日期时间)格式存储了日期。我需要将此日期转换为时间戳。

我尝试了 to_timestamp() 但它不适用于时区。

ERROR:  "TZ"/"tz"/"OF" format patterns are not supported in to_date

我试过 ::timestamptz 但它认为日期格式为MM/DD/YYYY HH24:MI TZ

ERROR:  date/time field value out of range

有没有办法将格式从DD/MM/YYYY HH24:MI TZ 转换为MM/DD/YYYY HH24:MI TZ 或将DD/MM/YYYY HH24:MI TZ 转换为时间戳?

例如“28/04/2017 13:00 +2:30”

【问题讨论】:

    标签: sql postgresql datetime timestamp


    【解决方案1】:

    尝试直接投射?..

    so=# select to_timestamp('04/28/2017 13:00 +2:30','D/MM/YYYY HH24:MI TZ');
    ERROR:  "TZ"/"tz"/"OF" format patterns are not supported in to_date
    Time: 20.850 ms
    so=# select '04/28/2017 13:00 +2:30'::timestamptz;
          timestamptz
    ------------------------
     2017-04-28 10:30:00+00
    (1 row)
    
    Time: 0.554 ms
    

    https://www.postgresql.org/docs/current/static/functions-formatting.html

    to_timestamp 和 to_date 用于处理无法处理的输入格式 通过简单的铸造转换。对于大多数标准日期/时间格式, 只需将源字符串转换为所需的数据类型即可,并且 更容易。

    更新

    关于您的评论,您只需调整datestyle 即可更改解析:

    so=# set datestyle to DMY;
    SET
    Time: 9.997 ms
    so=# select '04/28/2017 13:00 +2:30'::timestamptz;
    ERROR:  date/time field value out of range: "04/28/2017 13:00 +2:30"
    LINE 1: select '04/28/2017 13:00 +2:30'::timestamptz;
                   ^
    HINT:  Perhaps you need a different "datestyle" setting.
    Time: 10.217 ms
    so=# set datestyle to MDY;
    SET
    Time: 8.799 ms
    so=# select '04/28/2017 13:00 +2:30'::timestamptz;
          timestamptz
    ------------------------
     2017-04-28 10:30:00+00
    (1 row)
    

    【讨论】:

    • 正如我在描述中提到的,我的日期格式为 DD/MM/YYYY,因此选择 '28/04/2017 13:00 +2:30'::timestamptz,将给出错误日期/time 字段值超出范围。
    • @ayushlodhi 更新了答案 - 为解析器设置日期样式以了解它应该期待什么
    • @VaosTsun 感谢您的回答,所以每次我都必须使用 set datestyle to MDY;在查询这个之前,有没有像 to_timestamp('04/28/2017 13:00 +2:30','D/MM/YYYY HH24:MI TZ') 这样的替代方法?
    • to_timestamp 和 to_date 不支持 TZ,因此您必须在会话级别或用户级别或数据库级别或集群级别设置 datestyle。我向您展示了如何在会话级别执行此操作 - 一旦设置所有下一个查询将使用新配置,直到您断开连接。如果您在全局范围内设置它,您将在重新连接后拥有它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2019-08-22
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多