说明
本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 PostgreSQL(CDWPG)。
背景
由于Greenplum底层的限制,非法时间戳是不能被插入GP的,那么如何能忽略这些非法时间戳并保留该条记录呢,下面我们做一下测试。
模拟场景
1. 创建测试表
创建两张测试表,一张时间戳字段为varchar,模拟非法数据源,另一张时间戳字段为timestamp
代码语言:javascript复制dy_test=# CREATE TABLE varchar_timestamp(name varchar, time varchar);
CREATE TABLE
dy_test=# CREATE TABLE timestamp(name varchar, time timestamp);
CREATE TABLE
2. 模拟非法时间戳
对varchare表插入非法时间戳
代码语言:javascript复制dy_test=# INSERT INTO varchar_timestamp VALUES ('test', '0000-00-00 00:00:00');
INSERT 0 1
3. 尝试插入非法时间戳
使用常规方式,将非法的时间戳查询出来并插入到timestamp表
代码语言:javascript复制dy_test=# INSERT INTO timestamp
dy_test-# SELECT name,
dy_test-# time
dy_test-# FROM varchar_timestamp;
ERROR: column "time" is of type timestamp without time zone but expression is of type character varying
HINT: You will need to rewrite or cast the expression.
这里可以明确地看到,由于字段time是timestamp,不接受字符串'0000-00-00 00:00:00',所以需要以另一种方式插入。
解决方案
使用NULLIF()实现忽略非法时间戳
代码语言:javascript复制dy_test=# INSERT INTO timestamp
dy_test-# SELECT name,
dy_test-# NULLIF(time, '0000-00-00 00:00:00')::timestamp
dy_test-# FROM varchar_timestamp;
INSERT 0 1
dy_test=# SELECT * FROM timestamp;
name | time
------ ------
test |
(1 row)
可以看到,非法时间戳已被替换成了NULL,并成功保留了该条记录。