Mysql SQL(phpMyAdmin):使用命令更改日期的列格式

Mysql SQL(phpMyAdmin):使用命令更改日期的列格式,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我有一个名为“expdate”的列,类型为“varchar”,值如下: 2021-02-27 28-02-2023 29/02/2024 . . . 现在,我想将所有日期值(如格式%d-%m-%Y)更改为%Y-%m-%d,并保存到新列中,键入日期并使用: UPDATE `Users` SET `fixed_expdate` = STR_TO_DATE(REPLACE(`expdate`,"/",'-'), "%d-%m-%Y") where `

我有一个名为“expdate”的列,类型为“varchar”,值如下:

2021-02-27
28-02-2023
29/02/2024
.
.
.
现在,我想将所有日期值(如格式%d-%m-%Y)更改为%Y-%m-%d,并保存到新列中,键入日期并使用:

UPDATE `Users`
    SET `fixed_expdate` = STR_TO_DATE(REPLACE(`expdate`,"/",'-'), "%d-%m-%Y")
 where `expdate` != '0000-00-00'
但是sql命令会显示如下错误:

SQL query: UPDATE `Users` SET `fixed_expdate` = STR_TO_DATE(REPLACE(`expdate`,"/",'-'), "%d-%m-%Y") where `expdate` != '0000-00-00' MySQL said: Documentation #1411 - Incorrect datetime value: '2021-02-27' for function str_to_date
我需要sql命令,您的解决方案是什么?

您必须为每个单独的源数据格式使用不同的转换表达式。您必须检查转换中是否只包含与当前查询中使用的模式匹配的值

这可以使用许多单独的查询来执行,每个查询转换一种现有的源格式

-转换格式正确的日期 更新“用户” 设置'fixed_expdate`='expdate` 其中`expdate`REGEXP'\d\d\d-\d\d-\d\d'; -转换日期为2023年2月28日 更新“用户” 将'fixed'u expdate`=STR\u设置为'expdate`,%d-%m-%Y 其中`expdate`REGEXP'\d\d-\d\d-\d\d\d'; -转换日期为2024年2月29日 更新“用户” 将'fixed'u expdate`=STR\u设置为'u DATE'expdate`,%d\/%m\/%Y 其中`expdate`REGEXP'\d\d\/\d\d\/\d\d\d'; -等等 在每次单独转换或多次转换后,您可以查看未转换的行

选择“expdate”` 来自`用户` 其中'fixed_expdate'为空 极限XXX 并为尚未使用的模式构建下一个转换表达式,直到成功转换所有值

MySQL说:文档 1411-函数str_to_date的日期时间值不正确:“2021-02-27”

这是由于两种不同的格式在日和月位置上不同,它们是交换的-它们不容易区分。如果数据中同时存在两种格式,则必须使用附加检查。如果两种格式都可以,则无法区分必须应用哪种格式,例如,当值为“01/02/2021”时

从注释复制的更新


您的正则表达式可能应该在字符串“^”和“$”的开头和结尾有锚定符


您必须添加检测三种典型格式的功能:European是'dd[./-]mm[./-]yyy'。美国人是“mm/dd/yyyy”。ISO是“yyyy-mm-dd”。只有在另一种格式的当月数字无效的情况下,才能区分美式和欧式。ISO格式很简单。一旦你能从欧洲检测到美国人,你就可以使用不同的STR_TO_DATE调用来创建你的日期你的正则表达式应该在字符串“^”和“$”的开头和结尾有锚定符。@GordonLinoff是的,这可能是安全的。