You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

PostgreSQL中DD/MM/YYYY HH24:MI TZ格式转timestamp方法咨询

解决PostgreSQL中DD/MM/YYYY HH24:MI TZ格式转Timestamp的问题

首先咱们先理清你遇到的两个核心问题:to_date()报错是因为它只处理日期部分,不支持时区相关的格式符;直接用::timestamptz转换出错是因为PostgreSQL默认的日期解析规则把你的DD/MM格式当成了MM/DD,导致日期范围越界。下面给你具体的解决方案:

1. 直接将DD/MM/YYYY HH24:MI TZ转换为带时区的时间戳(timestamptz)

你需要用to_timestamp()函数而非to_date(),因为前者支持时区格式解析。根据你的时区是缩写(比如UTC、EST)还是全称(比如America/New_York),选择对应的格式符:

  • 如果是时区缩写(如UTC),用tz格式符:
SELECT to_timestamp('31/12/2023 23:59 UTC', 'DD/MM/YYYY HH24:MI tz');
  • 如果是时区全称,用TZ格式符:
SELECT to_timestamp('31/12/2023 23:59 America/New_York', 'DD/MM/YYYY HH24:MI TZ');

这个查询会返回timestamptz类型的结果,已经正确解析了你的日期格式和时区。

2. 转换为不带时区的Timestamp类型

如果需要得到不带时区的timestamp,可以在解析后进行类型转换,或者指定时区转换:

-- 转换为当前数据库时区的timestamp
SELECT to_timestamp('31/12/2023 23:59 UTC', 'DD/MM/YYYY HH24:MI tz')::timestamp;

-- 或者指定时区转换为timestamp(比如转成UTC时区的timestamp)
SELECT (to_timestamp('31/12/2023 23:59 UTC', 'DD/MM/YYYY HH24:MI tz') AT TIME ZONE 'UTC')::timestamp;

3. 将原格式转换为MM/DD/YYYY HH24:MI TZ字符串

如果只是想把原日期字符串的格式从DD/MM改成MM/DD,保持时区不变,可以先解析成timestamptz,再用to_char()重新格式化:

SELECT to_char(
    to_timestamp('31/12/2023 23:59 UTC', 'DD/MM/YYYY HH24:MI tz'),
    'MM/DD/YYYY HH24:MI tz'
);

执行后会输出类似12/31/2023 23:59 UTC的字符串。

为什么之前的方法会报错?

  • to_date()报错to_date()的作用是生成date类型(仅日期,无时区),所以它不支持任何与时区相关的格式符(TZ/tz/OF),必须用to_timestamp()来处理带时区的完整时间字符串。
  • ::timestamptz报错:PostgreSQL默认的datestyle设置通常是MDY(月/日/年),所以直接用::timestamptz转换时,它会把31/01/2023当成“31月1日”,这显然超出了月份的范围(1-12),所以报错。必须通过to_timestamp()明确指定格式串,才能让数据库正确识别日/月的顺序。

内容的提问来源于stack exchange,提问作者ayush lodhi

火山引擎 最新活动