将 ISO8601 字符串隐式转换为 Debezium 的 TIMESTAMPTZ (postgresql)
Implicitly cast an ISO8601 string to TIMESTAMPTZ (postgresql) for Debezium
我正在使用第 3 方应用程序(Debezium 连接器)。它必须将 ISO-8601 格式的日期时间字符串写入 TIMESTAMPTZ 列。不幸的是,这失败了,因为没有从 varchar 到时间戳 tz 的隐式转换。
我确实注意到以下工作:
SELECT TIMESTAMPTZ('2021-01-05T05:17:46Z');
SELECT TIMESTAMPTZ('2021-01-05T05:17:46.123Z');
我尝试了以下方法:
- 创建函数和转换
CREATE OR REPLACE FUNCTION varchar_to_timestamptz(val VARCHAR)
RETURNS timestamptz AS $$
SELECT TIMESTAMPTZ(val) INTO tstz;
$$ LANGUAGE SQL;
CREATE CAST (varchar as timestamptz) WITH FUNCTION varchar_to_timestamptz (varchar) AS IMPLICIT;
不幸的是,它给出了以下错误:
function timestamptz(character varying) does not exist
我也尝试了与上面相同的方法,但是使用 plpgsql 并得到了同样的错误。
我尝试编写手动解析,但遇到了可选微秒段的问题,这给了我以下内容
CREATE OR REPLACE FUNCTION varchar_to_timestamptz (val varchar) RETURNS timestamptz AS $$
SELECT CASE
WHEN LIKE '%.%'
THEN to_timestamp(, 'YYYY-MM-DD"T"HH24:MI:SS.USZ')::timestamp without time zone at time zone 'Etc/UTC'
ELSE to_timestamp(, 'YYYY-MM-DD"T"HH24:MI:SSZ')::timestamp without time zone at time zone 'Etc/UTC' END $$ LANGUAGE SQL;
哪个有效,但感觉不正确。
有没有更好的方法来处理这个隐式转换?
如果应在插入时转换值,请定义赋值转换。你不需要任何功能;使用类型输入和输出函数将执行:
CREATE CAST (varchar AS timestamptz) WITH INOUT AS ASSIGNMENT;
请注意,混淆标准数据类型的强制转换会导致问题,因为它会增加歧义。如果您能找到一种使用显式强制转换的方法,那就更好了。
我正在使用第 3 方应用程序(Debezium 连接器)。它必须将 ISO-8601 格式的日期时间字符串写入 TIMESTAMPTZ 列。不幸的是,这失败了,因为没有从 varchar 到时间戳 tz 的隐式转换。
我确实注意到以下工作:
SELECT TIMESTAMPTZ('2021-01-05T05:17:46Z');
SELECT TIMESTAMPTZ('2021-01-05T05:17:46.123Z');
我尝试了以下方法:
- 创建函数和转换
CREATE OR REPLACE FUNCTION varchar_to_timestamptz(val VARCHAR)
RETURNS timestamptz AS $$
SELECT TIMESTAMPTZ(val) INTO tstz;
$$ LANGUAGE SQL;
CREATE CAST (varchar as timestamptz) WITH FUNCTION varchar_to_timestamptz (varchar) AS IMPLICIT;
不幸的是,它给出了以下错误:
function timestamptz(character varying) does not exist
我也尝试了与上面相同的方法,但是使用 plpgsql 并得到了同样的错误。
我尝试编写手动解析,但遇到了可选微秒段的问题,这给了我以下内容
CREATE OR REPLACE FUNCTION varchar_to_timestamptz (val varchar) RETURNS timestamptz AS $$
SELECT CASE
WHEN LIKE '%.%'
THEN to_timestamp(, 'YYYY-MM-DD"T"HH24:MI:SS.USZ')::timestamp without time zone at time zone 'Etc/UTC'
ELSE to_timestamp(, 'YYYY-MM-DD"T"HH24:MI:SSZ')::timestamp without time zone at time zone 'Etc/UTC' END $$ LANGUAGE SQL;
哪个有效,但感觉不正确。
有没有更好的方法来处理这个隐式转换?
如果应在插入时转换值,请定义赋值转换。你不需要任何功能;使用类型输入和输出函数将执行:
CREATE CAST (varchar AS timestamptz) WITH INOUT AS ASSIGNMENT;
请注意,混淆标准数据类型的强制转换会导致问题,因为它会增加歧义。如果您能找到一种使用显式强制转换的方法,那就更好了。