使用 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 创建默认列,但在插入数据时出现字符变化错误的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE PL/SQL - 使用 SYSDATE 检索特定日期的数据时出现检索问题
使用 UCanAccess 插入 ResultSet 时出现“必须在插入之前设置所有列”错误