SQL更改列类型时遇到错误自动删除

rq这一列存储的内容是类似: 2023-2-21 这种字符串,现在要将其格式改成date。

ALTER TABLE `ldh`.`dl`  CHANGE COLUMN `rq` `rq` DATE NULL ;

但是这一列有部分单元格不是这种类型,比如缺少字段:2023-3这样的,就会报错。
如果要将这种错误值直接替换成空值,应该怎么办?

添加一列,再更新数据,符合日期格式的更新到新列,最后删除旧列改名新列。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7586466
  • 这篇博客也不错, 你可以看下利用SQL做好数调,修改表中某个日期的字段,只改变它的日期年月日,不改变原本的小时,分钟,秒
  • 除此之外, 这篇博客: 【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据中的 四、使用日期的特殊部分比较记录 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在报表统计中常有同期对比的需求演示案例需求为:
    统计相同月份与周内日期聘用的员工,如:有两个员工都是3月份周一聘用的则可以用分析函数计算次数然后进行过滤语句如下:

    SQL> 
    SQL> select ename,hiredate,to_char(hiredate,'mon day') as 星期
      2  from (
      3  select ename,hiredate,count(*)over(partition by to_char(hiredate,'mon day')) as ct
      4  from emp
      5  )
      6  where ct >1;
    
    ENAME      HIREDATE    星期
    ---------- ----------- ---------------------------------------------------------------------------
    FORD       1981-12-3   12月 星期四
    JAMES      1981-12-3   12月 星期四
    
    SQL> 
    

    上述语句中要注意以下几点:

    • 我们使用了分析函数COUNT()over(),这样可以只访问一次emp就同时得到了明细(ename,hiredate)及汇总信息(cnt)。与分析函数之前需要两次访问emp的写法相比提高了效率。
    • 因为不需要过滤to_char函数的结果这里可以不必使用"mmd"写法。

  • 您还可以看一下 任铄老师的2022软考数据库系统工程师-基础知识培训视频课程中的 SQL语言--完整性约束小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对于SQL更改列类型时遇到错误自动删除的问题,可以通过以下步骤解决: 1. 创建一个新列作为替代列。 可以使用以下命令创建一个新列: ALTER TABLE 表名 ADD COLUMN new_column_name DATE; 这将在表中添加一个新的日期类型列。 2. 将原始列中的数据插入到新列中。 可以使用以下命令将原始列中的数据插入到新列中: UPDATE 表名 SET new_column_name = STR_TO_DATE(original_column_name,'%Y-%m-%d'); 这将使用STR_TO_DATE函数将原始列中的数据转换为日期格式,并将其插入到新列中。 请注意,如果原始列中存在无法转换为日期格式的值,该命令将失败并报错。如果遇到这种情况,可以修改原始数据,使其符合日期格式,然后再次运行此命令。 3. 删除原始列。 可以使用以下命令删除原始列: ALTER TABLE 表名 DROP COLUMN original_column_name; 请注意,在此之前,应该先确保在新列中已经成功地存储了所有数据。 4. 重命名新列。 可以使用以下命令将新列命名为原始列的名称: ALTER TABLE 表名 CHANGE new_column_name original_column_name DATE; 这将将新列重命名为原始列的名称,并将其类型更改为日期类型。 请注意,如果在任何时候出现问题,应该及时备份数据,以防止数据丢失。可以使用mysqldump命令备份整个数据库或单个表。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^