【发布时间】:2026-01-29 04:45:01
【问题描述】:
我正在从 csv 文件中获取数据并将其全部放入临时表中,因此所有内容都是字符串格式。
所以即使是日期字段也是字符串格式,所以我需要将日期从字符串转换为日期。所有日期都采用这种格式 28/02/2013
我为此使用了 STR_TO_DATE,但我遇到了问题。 这是我的代码的 sn-p。
INSERT INTO `invoice` (`DueDate`)
SELECT
STR_TO_DATE('','%d/%m/%Y')
FROM `upload_invoice`
当然还有比这更多的领域,但我专注于不起作用的领域。 如果日期无效,则使用此命令应输入 null,但不是输入 null,而是生成错误。
#1411 - Incorrect datetime value: '' for function str_to_date
我了解错误的含义。这意味着它得到一个空字段而不是正确格式化的日期,但是在阅读文档后它不应该抛出错误,而是应该插入一个空值。
但是,如果我使用不带 INSERT 的 SELECT 语句,它会起作用。
我可以做下面这行,它确实有效
IF(`DueDate`!='',STR_TO_DATE(`DueDate`,'%d/%m/%Y'),null) as `DueDate`
因此,如果该字段为空,则 STR_TO_DATE 不会运行。现在这可行,但它无法检查无效的日期,例如日期是否为 ASDFADFAS。
然后我尝试了
IF(TO_DAY(STR_TO_DATE(`DueDate`,'%d/%m/%Y') IS NOT NULL),STR_TO_DATE(`DueDate`,'%d/%m/%Y'),null) as `DueDate`
但这仍然会在 if 语句中出现 #1411 错误。
所以我的问题是为什么 STR_TO_DATE 不在错误的日期返回 NULL?我不应该收到 #1411 错误。
这不是另一个问题的完全重复。也没有令人满意的答案。我解决了一段时间,并添加了我的解决方案,这实际上是另一篇文章中给出的更好的解决方案,所以我认为由于我的答案更好,这应该保留。
【问题讨论】:
-
mysql > set sql_notes = 0;它阻止 mysql 显示类似 1411 的警告 -
我无法访问我们服务器上 mysql 的内部工作。所以我觉得我做不到