Redshift插入日期值异常:预期取sysdate却得到原表日期
问题原因及解决方案
核心原因
你的SQL语句中,sysdate被解析为了table2中的列而非Redshift内置的系统函数。这是因为当表中存在与内置函数同名的列时,SQL解析器会优先引用表列,而非系统函数。结合你的结果来看,大概率是table2中存在名为sysdate的列(你描述中提到的"date为2023-1-1"实际是该列的值),导致插入时取到了表中存储的旧日期,而非当前系统时间。
另外也不排除你编写SQL时的笔误(比如误将sysdate写成了date,直接引用了table2的date列),但根据你提供的代码片段,前者是更常见的触发场景。
解决方法
1. 强制调用系统函数
通过添加括号或使用函数的完整限定名,明确告诉Redshift调用系统函数而非表列:
-- 方法1:给sysdate加括号(Redshift支持这种写法强制解析为函数) insert into table1 (ID,date) select ID, sysdate() from table2; -- 方法2:使用函数的完整限定名 insert into table1 (ID,date) select ID, pg_catalog.sysdate from table2;
2. 替换为无冲突的同功能函数
改用current_date(仅返回日期)或current_timestamp(返回日期+时间),这些函数与业务列名冲突的概率更低:
insert into table1 (ID,date) select ID, current_date from table2;
3. 消除源头冲突(推荐)
如果table2中确实存在名为sysdate的列,建议直接重命名该列,彻底避免后续的解析混淆:
ALTER TABLE table2 RENAME COLUMN sysdate TO record_create_date;
执行上述修正后的SQL后,重新查询table1即可得到预期的当前系统日期。
内容的提问来源于stack exchange,提问作者Day Lee
相关产品推荐
相关产品推荐

