使用 sysdate 创建默认列,但在插入数据时出现字符变化错误

Posted

技术标签:

【中文标题】使用 sysdate 创建默认列,但在插入数据时出现字符变化错误【英文标题】:Creating a default column using sysdate but getting a character varying error when inserting data 【发布时间】:2020-05-21 17:54:57 【问题描述】:

我正在使用默认的 sysdate 列在 redshift 中创建一个表但是当我插入数据时,我得到一个奇怪的表达式是类型字符变化错误。这是我第一次遇到这个错误。

CREATE TABLE IF NOT EXISTS shipments_swp
(
shipment_id                      bigint DISTKEY ENCODE RAW,
user_id                          bigint ENCODE ZSTD,
last_tracking_event_time         timestamp encode zstd,
bd_updated_at                    timestamp default sysdate ENCODE ZSTD
);

Insert into shipments_swp
(
select *
from common.shipments_dim
);

报错信息如图

SQL Error [500310] [42804]: [Amazon](500310) Invalid operation: column "bd_updated_at" is of type timestamp without time zone but expression is of type character varying;

【问题讨论】:

你也可以添加shipments_dim的ddl吗? 【参考方案1】:

您能否发布一个您尝试插入该列的时间戳的示例?在将其写入 shipping_swp 之前,您可能需要将该列转换为时间戳。我尝试了一个简单的测试以查看插入是否正常工作,并且插入没有问题:

CREATE TABLE IF NOT EXISTS test_table_a (
    ts_a    TIMESTAMP DEFAULT SYSDATE ENCODE ZSTD
);

-- Insert a few different date formats
insert into test_table_a values('2020/05/22');
insert into test_table_a values('2020-05-22');
insert into test_table_a values('2020-05-22 16:12:27.830728');
insert into test_table_a values('2020-05-22 16:06:00');

--- Create a second table and write to that 
--- to mimic the insert behavior from the question

CREATE TABLE IF NOT EXISTS test_table_b (
    ts_b    TIMESTAMP DEFAULT SYSDATE ENCODE ZSTD
);

INSERT INTO test_table_b (
    SELECT *
    FROM test_table_a
);

--- This insert succeeds
SELECT * FROM test_table_b;

2020-05-22 16:06:00
2020-05-22 00:00:00
2020-05-22 16:06:56.823844
2020-05-22 00:00:00

【讨论】:

以上是关于使用 sysdate 创建默认列,但在插入数据时出现字符变化错误的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:从应用程序而不是数据库插入列值

ORACLE PL/SQL - 使用 SYSDATE 检索特定日期的数据时出现检索问题

使用 UCanAccess 插入 ResultSet 时出现“必须在插入之前设置所有列”错误

Oracle中插入默认时间

在使用 NamedParameterJDBCTemplate 进行插入时出现“无效的列类型”异常

MySQL字段默认值设置详解