我在将一些数据插入 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';
它没有改变显示值。时区显示值和时间显示值都没有改变。
我考虑使用字符串转换和字符串操作来执行一些“黑客”操作,但怀疑这可能不是最直接的方法。
我应该注意,我想保留时间和时区信息。换句话说,我不想将日期时间列转换为日期列。
那是行不通的,因为 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');