如何在转换为时间戳类型时忽略无效数据?

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

我有一个表,其中有一列

timestamp
,其类型为
text
。大多数行的时间戳格式为
2024-10-13T00:00:00.000Z
。但有些行的时间戳值无效。

当我使用这个

date_trunc
来聚合时间戳时,

select date_trunc('hour', ("timestamp")::timestamp) hourly

我收到此错误:

 ERROR: invalid input syntax for type timestamp: "xxxxxx"

无效值可以是任何值,包括

null
。有没有办法跳过任何无效值?

postgresql
1个回答
0
投票

在 PostgreSQL 16 及更高版本中,有

pg_input_is_valid()
:

select date_trunc('hour', ("timestamp")::timestamp) hourly
from your_table
where pg_input_is_valid("timestamp",'timestamp');

来自文档:

pg_input_is_valid ( string text, type text ) → boolean

测试给定字符串是否是指定数据类型的有效输入,返回 true 或 false。 仅当数据类型的输入函数已更新为将无效输入报告为“软”错误时,此函数才会按需要工作。否则,无效输入将中止交易,就像字符串已直接转换为类型一样。

pg_input_is_valid('42', 'integer') → t
pg_input_is_valid('42000000000', 'integer') → f
pg_input_is_valid('1234.567', 'numeric(7,4)') → f

在 PostgreSQL 15 及更早版本中,您可以构建自己的:

create or replace function is_interpretable_as(arg text, arg_type text) 
returns boolean language plpgsql as $$
begin
    execute format('select cast(%L as %s)', arg, arg_type);
    return true;
exception when others then
    return false;
end $$;

请注意,无论参数或类型是否无效,或两者都无效,这都会返回

false

演示

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