我正在从客户那里获取原始数据,并使用脚本将其加载到数据库中。截至目前,我将所有内容存储为字符串。我有这种格式的数据:
01.01.2024 00:06:09.125
。
我想将表列转换为类型
timestamp with time zone
,但遇到格式错误。ALTER TABLE <table Name>
ALTER COLUMN <column name> TYPE timestamp with time zone USING <column name>::timestamp with time zone
出现以下错误:
查询错误:错误:日期/时间字段值超出范围:“18.02.2024 10:10:40.409”提示:也许您需要不同的“日期样式”设置。
我尝试过直接在 excel/csv 文件中应用日期格式,但还是失败了。
让我们知道您正在使用的数据库。
这是我在 Postgres 中使用的示例
Fiddle 包含使用时间戳数据类型创建新列、基于旧列更新新列,然后删除旧列的步骤。
SELECT TO_TIMESTAMP('01.01.2024 00:06:09.125', 'DD.MM.YYYY HH24:MI:SS.MS')
如果列中已有格式不正确的数据,您将无法更改该列。
我建议您创建另一个列,然后运行更新以以正确的格式“复制”到这个新列。然后您可以根据需要重命名。
samhita 的回答只是提示你应该做什么。
运行此更新:
UPDATE <your table> set <new column> = TO_TIMESTAMP(<column name>, 'DD.MM.YYYY HH24:MI:SS.MS') WHERE 1
这应该以日期/时间格式正确填充您的新列。
您的时间戳文字采用默认的德语(和许多其他国家/地区)格式'DD.MM.YYYY'。最好在任何地方都使用 ISO 格式 'YYYY-MM-DD',但对于您当前的困境:
datestyle
。然后你已经尝试过的命令就可以工作了。可以暂时让会话转换您的时间戳文字,也可以永久保存在 postgresql.conf
中(如果您确实需要的话)。
首先检查:
SHOW datestyle;
在您的会议中:
SET datestyle = 'ISO, DMY';
ALTER TABLE <table name>
ALTER COLUMN <column name> TYPE timestamptz USING <column name>::timestamptz
-- RESET datestyle; -- ?
和to_timestamp
的存在是为了处理无法处理的输入格式 通过简单的铸造即可转换。对于大多数标准日期/时间格式, 只需将源字符串转换为所需的数据类型即可,并且 更容易。to_date
...假设
datestyle
设置适当。
由于您要转换没有偏移量的时间戳(
timestamp
文字,而不是timestamptz
),因此转换默认为当前会话的timezone
设置。您可能也想进行相应的设置。
相关: