前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >将0000-00-00 00:00:00等非法时间戳写入Greenplum

将0000-00-00 00:00:00等非法时间戳写入Greenplum

原创
作者头像
岳涛
修改2021-09-26 17:21:30
1.2K0
修改2021-09-26 17:21:30
举报
文章被收录于专栏:大数据生态大数据生态

说明

本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 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,并成功保留了该条记录。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 背景
  • 模拟场景
    • 1. 创建测试表
      • 2. 模拟非法时间戳
        • 3. 尝试插入非法时间戳
        • 解决方案
        相关产品与服务
        大数据
        全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档