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` != '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

最新更新