我有一个名为"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查询:UPDATE `Users`SET`fixed_expdate`=STR_TO_DATE(REPLACE(`expdate`,"/",'-'(,"%d-%m-%Y"(其中`expdate'!='0000-00-00'MySQL表示:文档#1411-函数str_to_date的日期时间值不正确:"2021-02-27">
我需要sql命令,您的解决方案是什么?
对于每个单独的源数据格式,必须使用不同的转换表达式。您必须检查转换中是否只包含与当前查询中使用的模式匹配的值。
这可以使用许多单独的查询来执行,每个查询都转换一种现有的源格式。
-- convert the dates which have correct format
UPDATE `Users`
SET `fixed_expdate` = `expdate`
WHERE `expdate` REGEXP 'dddd-dd-dd';
-- convert dated which looks like 28-02-2023
UPDATE `Users`
SET `fixed_expdate` = STR_TO_DATE(`expdate`, "%d-%m-%Y")
WHERE `expdate` REGEXP 'dd-dd-dddd';
-- convert dated which looks like 29/02/2024
UPDATE `Users`
SET `fixed_expdate` = STR_TO_DATE(`expdate`, "%d/%m/%Y")
WHERE `expdate` REGEXP 'dd/dd/dddd';
-- and so on
在每次单独的转换之后(或在多次转换之后(,您可以查看未转换的行
SELECT `expdate`
FROM `Users`
WHERE `fixed_expdate` IS NULL
LIMIT XXX
并为尚未使用的模式构建下一个转换表达式,直到所有值都成功转换为止。
MySQL说:文档#1411-函数str_to_date 的日期时间值"2021-02-27"不正确
这是由于两种不同的格式,它们的日期和月份不同(可以交换(-它们无法轻易区分。如果数据中同时存在这两种格式,则必须使用额外的检查。如果两种格式都可能(例如,当值为'01/02/2021'
时(,则无法区分必须应用的格式。
更新(从注释复制(
正则表达式可能应该在字符串('^'和'$'(的开头和结尾都有锚。–Gordon Linoff