以非标准格式转换带有时间戳文字的文本列

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

我正在从客户那里获取原始数据,并使用脚本将其加载到数据库中。截至目前,我将所有内容存储为字符串。我有这种格式的数据:

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 文件中应用日期格式,但还是失败了。

sql postgresql datetime
3个回答
2
投票

让我们知道您正在使用的数据库。

这是我在 Postgres 中使用的示例

Fiddle 包含使用时间戳数据类型创建新列、基于旧列更新新列,然后删除旧列的步骤。

  SELECT  TO_TIMESTAMP('01.01.2024 00:06:09.125', 'DD.MM.YYYY HH24:MI:SS.MS') 

1
投票

如果列中已有格式不正确的数据,您将无法更改该列。

我建议您创建另一个列,然后运行更新以以正确的格式“复制”到这个新列。然后您可以根据需要重命名。

samhita 的回答只是提示你应该做什么。

运行此更新:

UPDATE <your table> set <new column> = TO_TIMESTAMP(<column name>, 'DD.MM.YYYY HH24:MI:SS.MS') WHERE 1

这应该以日期/时间格式正确填充您的新列。


0
投票

您的时间戳文字采用默认的德语(和许多其他国家/地区)格式'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;  -- ?

db-fiddle

手册建议:

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

...假设

datestyle
设置适当。

由于您要转换没有偏移量的时间戳(

timestamp
文字,而不是
timestamptz
),因此转换默认为当前会话的
timezone
设置。您可能也想进行相应的设置。

相关:

© www.soinside.com 2019 - 2024. All rights reserved.