如何解决Oracle中将DATE转为DATETIME时的ORA-22858报错
报错原因
- Oracle 18c 不存在内置的
DATETIME数据类型,该类型是MySQL、SQL Server等其他数据库的专属类型,Oracle中存储带时间的日期数据的类型为DATE(精度到秒)和TIMESTAMP(精度最高到纳秒),你语句中指定的目标类型不被Oracle识别。 - 即便将目标类型替换为Oracle支持的
TIMESTAMP,直接使用ALTER TABLE ... MODIFY语句修改已有数据的DATE类型列,也属于Oracle不允许的直接类型变更场景,因此触发ORA-22858: invalid alteration of datatype报错。
正确转换方案
如果需要实现其他数据库DATETIME的等效能力,Oracle中使用TIMESTAMP类型即可,小表场景可按以下步骤操作:
- 新增临时TIMESTAMP列
ALTER TABLE APPOINTMENT_ldr ADD ApptDateTime_TMP TIMESTAMP;
- 迁移原列数据到临时列,显式转换避免隐式转换风险
UPDATE APPOINTMENT_ldr SET ApptDateTime_TMP = CAST(ApptDateTime AS TIMESTAMP); COMMIT;
- 删除原有DATE类型的旧列
注意:如果原
ApptDateTime列存在索引、非空约束或者其他关联约束,需要先删除对应约束和索引,再执行删列操作
ALTER TABLE APPOINTMENT_ldr DROP COLUMN ApptDateTime;
- 将临时列重命名为原列名
ALTER TABLE APPOINTMENT_ldr RENAME COLUMN ApptDateTime_TMP TO ApptDateTime;
如果是生产环境大表,不想长时间锁表影响业务,可以使用Oracle的DBMS_REDEFINITION包做在线重定义完成转换。
内容的提问来源于stack exchange,提问作者carlos931
相关产品推荐
相关产品推荐

