STR_TO_DATE给出错误而不是null

时间:2017-07-25 11:02:14

标签: mysql date

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

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

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

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

我理解错误的含义。这意味着它正在获取一个空字段而不是格式正确的日期,但在阅读文档之后,它不应该抛出错误,但它应该插入一个null。

但是,如果我使用没有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错误。

这与其他问题不完全相同。也没有一个令人满意的答案。我解决了一段时间,我已经添加了我的解决方案,这实际上是另一篇文章中给出的更好的解决方案,所以我认为因为我的答案更好,所以应该留下来。

2 个答案:

答案 0 :(得分:0)

您可以尝试的选项:

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

答案 1 :(得分:0)

我忘了我发布了这个问题,但我刚才解决了这个问题

mean([
    cosine_distance(x[0][0], x[1][0]),
    cosine_distance(x[0][1], x[1][1]),
    cosine_distance(x[0][2], x[1][2]),
    cosine_distance(x[0][3], x[1][3]),
    cosine_distance(x[0][4], x[1][4]),
])

因为线路很长而且令人困惑,我做了一个像这样的功能

IF(`{$date}`!='',STR_TO_DATE(`{$date}`,'%d/%m/%Y'),null) as `{$date}`

我真的忘了我发布了这个问题。这似乎是永恒的,但这就是我解决问题的方法。