【问题标题】:Changing datatype from DateTime to Time in DB2 gives error在 DB2 中将数据类型从 DateTime 更改为 Time 会出错
【发布时间】:2016-05-06 05:38:13
【问题描述】:

以下sql在开发数据库中成功执行。

SQL 用于将数据类型从DATETIME 更改为TIME

ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT ALTER COLUMN FROM_DT SET DATA TYPE TIME;

但在部署数据库中却报错

准备期间出错 42601(-104)[IBM][CLI 驱动程序][DB2/NT] SQL0104N 在“ROM_DT SET DATA TYPE”之后发现了一个意外的令牌“TIME”。 预期的标记可能包括:“”。 SQLSTATE=42601

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    嘿,可能是因为 DB2 的版本变化

    我尝试了以下查询以将数据类型从 DATETIME 更改为 TIME

    ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT ADD COLUMN TempFromTime TIME ;
    
    CALL SYSPROC.ADMIN_CMD ('reorg table SCHEDULER.MV_SCHDL_APPOINTMENT');
    
    UPDATE SCHEDULER.MV_SCHDL_APPOINTMENT SET TempFromTime =CAST(FROM_DT AS TIME);
    ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT DROP COLUMN FROM_DT;
    
    ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT ADD COLUMN FROM_DT TIME ;
    
    CALL SYSPROC.ADMIN_CMD ('reorg table SCHEDULER.MV_SCHDL_APPOINTMENT');
    
    UPDATE SCHEDULER.MV_SCHDL_APPOINTMENT SET FROM_DT=TempFromTime ;
    
    ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT DROP COLUMN TempFromTime;
    
    CALL SYSPROC.ADMIN_CMD ('reorg table SCHEDULER.MV_SCHDL_APPOINTMENT');
    

    步骤:

    1. 创建临时列
    2. 使用所需列中的更新数据将数据复制到临时列。
    3. 删除现有列。
    4. 添加带有设计数据类型和名称的新列。
    5. 使用临时列更新新列数据
    6. 删除临时列。

    如果您能够通过查询重命名列,则重命名临时列并且可以跳过第 4,5 和第 6 步。

    以下查询可用于重命名列。

    ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT CHANGE TempFromTime FROM_DT TIME;
    

    它完成了我的任务.. :) 但这不是很好的方法。

    我仍在寻找更好的解决方案。这个解决方案也适用于我。

    【讨论】:

    • ...您可能只需要在最后一个命令之后进行重组。不过,我想我担心时间可能会与约会分开。
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多