我一直在试图从.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日期时间格式。
任何帮助将不胜感激。
答案 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