mysql - STR_TO_DATE 给出错误而不是 null

标签 mysql date

我正在从一个 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/

相关文章:

php - 如何从 codeigniter 运行参数是动态的 cron 作业

java - 我怎样才能在java中获得这个日期时间格式

php - 计算多个运输订单(php/mysql)

mysql - 无法连接到工作台中的 mysql 数据库,但我可以连接到 phpmyadmin 中的数据库

PHP MYSQL 问题 : Cannot fetch database information using $resultDetails->fetch_assoc

javascript - 使用输入类型打印年-月-日的日期

php - 插入mysql日期时间和日期时间仅通过添加日期和时间

MySQLFrequency频率报告

android - 将日历对象转换为日期 android 的问题

sql - MySQL 中的日期比较问题