我从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错误。
这与其他问题不完全相同。也没有一个令人满意的答案。我解决了一段时间,我已经添加了我的解决方案,这实际上是另一篇文章中给出的更好的解决方案,所以我认为因为我的答案更好,所以应该留下来。
答案 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}`
我真的忘了我发布了这个问题。这似乎是永恒的,但这就是我解决问题的方法。