gpt4 book ai didi

mysql - STR_TO_DATE 给出错误而不是 null

转载 作者:行者123 更新时间:2023-11-30 21:55:35 28 4
gpt4 key购买 nike

我正在从一个 csv 文件中获取数据并将其全部放入一个临时表中,因此所有内容都是字符串格式。

所以即使是日期字段也是字符串格式,所以我需要将日期从字符串转换为日期。所有日期都采用这种格式 28/02/2013

我为此使用了 STR_TO_DATE,但我遇到了问题。这是我的代码片段。

INSERT INTO `invoice` (`DueDate`)
SELECT
STR_TO_DATE('','%d/%m/%Y')
FROM `upload_invoice`

当然还有比这更多的字段,但我专注于不起作用的字段。如果日期无效,则使用此命令它应该放入一个空值,但它不会放入一个空值,而是生成一个错误。

#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> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.19 |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `upload_invoice`, `invoice`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `invoice` (
-> `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> `DueDate` DATE
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `upload_invoice` (
-> `DueDate` VARCHAR(10)
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `upload_invoice`
-> (`DueDate`)
-> VALUES
-> ('ASDFADFAS'), (NULL), (''),
-> ('28/02/2001'), ('30/02/2001');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> INSERT INTO `invoice`
-> SELECT
-> NULL,
-> IF(`DueDate` REGEXP '[[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}' AND
-> UNIX_TIMESTAMP(
-> STR_TO_DATE(`DueDate`, '%d/%m/%Y')
-> ) > 0,
-> STR_TO_DATE(`DueDate`, '%d/%m/%Y'),
-> NULL)
-> FROM `upload_invoice`;
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> SELECT `id`, `DueDate`
-> FROM `invoice`;
+----+------------+
| id | DueDate |
+----+------------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | 2001-02-28 |
| 5 | NULL |
+----+------------+
5 rows in set (0.00 sec)

参见 db-fiddle .

关于mysql - STR_TO_DATE 给出错误而不是 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45301379/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com