MySQL CSV导入:日期时间值

时间:2013-09-16 21:57:31

标签: mysql csv

我一直在试图从.csv文件导入日期时间值的墙上敲我的头。

这是导入声明。

LOAD DATA LOCAL INFILE 'myData.csv' INTO TABLE equity_last_import FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (equity,last,@last_date) SET last_date = STR_TO_DATE( @last_date, '%Y-%m-%d %H:%i:%s')

以下是数据样本:

4108,48.74,"2013-09-16 16:15:04"
4249,8.1,"2013-09-16 16:15:04"
4197,3.81,"2013-09-16 17:20:00"
4139,26.81,"2013-09-16 16:15:04"
4218,24.83,"2013-09-16 17:20:00"
4260,79.72,"2013-09-16 16:15:04"
4270,450.12,"2013-09-16 17:20:00"
4242,30.38,"2013-09-16 16:15:04"
4193,1.42,"2013-09-16 16:15:04"
4134,3.77,"2013-09-16 16:15:04"

我可以使用equity_last_import导入日期值,但我无法获取要导入的日期时间值。除了'%Y-%m-%d%H:%i:%s'之外,我尝试了几种不同的日期格式,我总是得到一个null datetime [0000-00-00 00:00:00]。我也尝试过不使用STR_TO_DATE(),因为该字符串是默认的MySQL日期时间格式。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:14)

数据文件中的日期已经采用MySQL原生应该理解的格式。它只是用双引号括起来的。您需要告诉LOAD DATA INFILE如何处理报价。尝试这样的事情:

LOAD DATA LOCAL INFILE 'myData.csv'
INTO TABLE equity_last_import
FIELDS OPTIONALLY ENCLOSED BY '"' TERMINATED BY ','
LINES TERMINATED BY '\n'
(equity,last,last_date)

更新

由于你说它不起作用,我创建了一个测试表并验证它确实有效。这是证据:

我已从问题中突出显示您的csv数据,并将其粘贴到系统的myData.csv文件夹中名为/tmp的新文件中。然后我连接到mysql控制台,切换到test数据库并运行以下命令:

mysql> create table equity_last_import (equity int, last decimal(10,2), last_date datetime) engine=innodb;
Query OK, 0 rows affected (0.02 sec)

mysql> LOAD DATA LOCAL INFILE '/tmp/myData.csv'
    -> INTO TABLE equity_last_import
    -> FIELDS OPTIONALLY ENCLOSED BY '"' TERMINATED BY ','
    -> LINES TERMINATED BY '\n'
    -> (equity,last,last_date);
Query OK, 10 rows affected (0.00 sec)
Records: 10  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from equity_last_import;
+--------+--------+---------------------+
| equity | last   | last_date           |
+--------+--------+---------------------+
|   4108 |  48.74 | 2013-09-16 16:15:04 |
|   4249 |   8.10 | 2013-09-16 16:15:04 |
|   4197 |   3.81 | 2013-09-16 17:20:00 |
|   4139 |  26.81 | 2013-09-16 16:15:04 |
|   4218 |  24.83 | 2013-09-16 17:20:00 |
|   4260 |  79.72 | 2013-09-16 16:15:04 |
|   4270 | 450.12 | 2013-09-16 17:20:00 |
|   4242 |  30.38 | 2013-09-16 16:15:04 |
|   4193 |   1.42 | 2013-09-16 16:15:04 |
|   4134 |   3.77 | 2013-09-16 16:15:04 |
+--------+--------+---------------------+
10 rows in set (0.00 sec)

请参阅?它运作得很好。

另一个更新:

您已指定现在收到以下错误:

Out of range value for column 'last_date' at row 1

您的CSV文件是否有标题?如果是这样,您可能需要在IGNORE 1 LINES命令中添加LOAD DATA INFILE,以告知MySQL跳过标题。

答案 1 :(得分:10)

我遇到了这个问题。我通过更改csv文件中日期列的格式来修复它,以匹配MySQL日期时间格式。在Excel中打开,突出显示列,右键单击,单击“设置单元格格式”。然后选择Custom并使用" yyyy / mm / dd hh:mm:ss"在“类型”字段中单击“无引号”,然后单击“确定”。我更改格式后导入了我的日期。

答案 2 :(得分:1)

我遇到了同样的麻烦,我发现了这些,我认为它可以帮到你

问题涉及GMT冲突: 我提取.csv文件的数据库是在GMT 00:00,所以没有夏令时。

默认情况下,我的本地服务器(我试图插入.csv文件的服务器)在我的计算机(系统' s)GMT上运行。就我而言,它是GMT -3,受夏令时影响。

SQL有一种处理夏令时的特殊方法,它忽略了夏令时开始发生时的确切日期和时间。在我的情况下,它是10月20日,当天00到凌晨1点之间的所有记录都没有得到服务器的识别,即使格式是正确的,因为它们根本就没有存在' (见更多here)。这会影响所有时间戳记录,而不仅仅是夏令时的具体细节。

我的解决方案是在创建新表并导入.csv之前将本地服务器设置为GMT +00,使用

SET time_zone='+00:00';

然后当我导入.csv文件时,所有记录都被正确读取。我想如果你设置时区等于生成.csv文件应该工作的时区!

答案 3 :(得分:0)

将头发拉出来也是因为我没有按照上面提到的方式进口。

解决方法:在导入表上创建一个类型为“VARCHAR”的临时字段temp_date,并且在加载数据时没有问题。然后,我能够在我的日期列上执行更新,类型为date。

    update table
    set date = temp_date