我有一个表,其中有一列
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
。有没有办法跳过任何无效值?
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
。