在我之前的问题中(当日期可用时 str_to_date 显示 NULL),我试图将 VARCHAR 日期时间更新为日期格式。
这是我正在使用的更新查询:
UPDATE `table` SET `dateColumn` = CASE
WHEN `dateColumn` = '' THEN NULL
ELSE date_format(str_to_date(`dateColumn`, '%m-%d-%Y %h:%i:%s %p'), '%Y-%m-%d') END;
上述查询应在 dateColumn 中查找日期。如果日期为空,则将其设置为 NULL。否则,更改日期格式。
我注意到的是,如果 dateColumn 与我指定的格式不匹配,查询不会停止查询并产生错误,而是会发出一条警告,内容如下:
Warning: #1411 Incorrect datetime value: '9/9/2024 12:00:00 AM' for function str_to_date
我知道格式是错误的,因为有斜线而不是破折号。
问题是,当我收到上述警告时,查询继续运行,但将所有日期(无论是否为空白)更改为 NULL。
我不希望查询将所有日期标记为 NULL。只标记空白日期。出于某种原因,这种情况不会发生,当这种情况发生时,我必须截断数据并再次导入并重新开始。
查询因错误而停止发生了什么?
为什么我却收到警告?
为什么查询会将所有日期更改为 NULL?
我是否需要更新查询,以便它不会将所有日期更改为 NULL?如果需要,该怎么做?
阅读https://dev.mysql.com/doc/refman/8.4/en/date-and-time-functions.html#function_str-to-date:
(重点是我的)
它并没有说它会停止查询或者产生错误。
它将日期更改为 NULL,因为您给出的
STR_TO_DATE()
格式与数据不匹配。也就是说,破折号和斜线之间的差异很大。演示:
正如手册所述,当它无法按照您告诉的格式解析数据时,它会返回 NULL。
您可能希望进行防御性编程,并仅将表达式应用于具有匹配格式的数据:
在这个例子中,
ELSE
子句是无操作;它返回的原始值dateColumn
,因为其他情况均不匹配。这使得值的格式可能不是有效日期,但至少它没有丢失。您可以尝试逐个修复落后者,而不必重新导入所有数据。