调用to_timestamp函数报错:function to_timestamp(character varying[], unknown)不存在
问题原因与解决办法
核心问题
你遇到的异常是因为**to_timestamp函数不支持直接接收数组作为输入参数**,而你传入的@3是一个字符串数组(character varying[]),PostgreSQL找不到匹配的函数签名,所以报错。
分场景解决
场景1:date字段是单个时间值
如果你的table表中date字段是单个timestamp类型,那说明你传参时搞错了——对应date的val.Values误传成了数组。检查valuesToInsert里的日期数据,改成单个字符串值,同时去掉该参数的NpgsqlDbType.Array标记。
场景2:date字段是时间数组类型(timestamp[])
如果date字段确实需要存储数组,得把数组里的每个元素单独转成时间,再重新组合成时间数组。修改SQL语句如下:
INSERT INTO table (name, value, date) VALUES (@1, @2, (SELECT array_agg(to_timestamp(elem, 'YYYYMMDDHH24MISSUS')) FROM unnest(@3) AS elem))
这段SQL的逻辑是:用unnest把字符串数组拆成单个元素,对每个元素调用to_timestamp转换,再用array_agg重新组合成时间数组。
额外提醒
你代码里的GetTypeByObject方法有个小问题:把bool类型归为Numeric是不对的,应该单独指定NpgsqlDbType.Boolean,否则可能出现类型转换异常:
NpgsqlDbType GetTypeByObject(object[] obj) => obj.FirstOrDefault() switch { string => NpgsqlDbType.Varchar, int or long => NpgsqlDbType.Numeric, bool => NpgsqlDbType.Boolean, double or float => NpgsqlDbType.Double, _ => NpgsqlDbType.Unknown, }
内容的提问来源于stack exchange,提问作者semper fi
相关产品推荐
相关产品推荐

