如何“修复”Postgres SQL 数据库中不正确的日期时间和时区?

问题描述 投票:0回答:1

我在将一些数据插入 SQL 表时出错。

包含错误的列具有日期时间时区感知类型,对于 Postgres 来说是

timestamptz

这是一个示例数据:

2023-10-24 00:00:00.000 +0100

它是根据日期创建的,没有时间或时区信息。这就是为什么时间默认为

00:00:00.000
,并且时区信息似乎默认为
BST
(
+0100
),因为这是在数据库服务器端或客户端(两台计算机)上获取的大概上个月改变了时区。

我该如何解决这个问题? (我已经修复了客户端代码。)

要“修复”它,需要执行以下步骤:

  • 更新时区不是
    +00:00
    的行。
  • 将时区信息设置回
    +00:00
  • 由于最初只有日期信息相关,因此时间不应更改,所有时间值应保持不变
    00:00

我试过这个:

alter table my_table
add column date_new timestamptz;

update my_table
set date_new = date_column at time zone 'UTC';

它没有改变显示值。时区显示值和时间显示值都没有改变。

我考虑使用字符串转换和字符串操作来执行一些“黑客”操作,但怀疑这可能不是最直接的方法。

我应该注意,我想保留时间和时区信息。换句话说,我不想将日期时间列转换为日期列。

sql postgresql datetime timezone
1个回答
0
投票

那是行不通的,因为 PostgreSQL 不会保留时区偏移量。相反,它将时间戳转换为 UTC 并以这种方式在内部存储。您会话中参数

timezone
的当前设置控制着显示的时区偏移量,这也导致了您现在遇到的问题。

也许您可以更新 UTC 晚上 11 点的所有时间戳:

UPDATE my_table
SET date_column = date_column + INTERVAL '1 hour'
WHERE date_column AT TIME ZONE '-01' =
      date_trunc('day', date_column AT TIME ZONE '-01');
© www.soinside.com 2019 - 2024. All rights reserved.