6

我一直在试图从 .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"

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

任何帮助将不胜感激。

4

4 回答 4

17

数据文件中的日期已经是 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 LINESLOAD DATA INFILE命令中以告诉 MySQL 跳过标题。

于 2013-09-16T22:00:44.370 回答
17

我遇到了同样的问题。我通过更改 CSV 文件中日期列的格式以匹配 MySQL 日期时间格式来修复它。

  1. 在 Excel 中打开 CSV。
  2. 突出显示该列。
  3. 右键单击该列。
  4. 点击Format Cells
  5. 挑选Custom
  6. yyyy/mm/dd hh:mm:ssType现场使用。
  7. 点击ok

如上所述更改日期时间格式后,我的 CSV 成功导入。

于 2016-06-06T18:57:51.787 回答
2

把我的头发拉出来也是因为我没有以上述建议的方式导入。

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

    update table
    set date = temp_date
于 2016-02-18T09:52:15.760 回答
1

我遇到了同样的麻烦,这就是我发现的,我想它可能会对你有所帮助

问题与 GMT 冲突有关:我提取 .csv 文件的数据库位于 GMT 00:00,因此没有夏令时。

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

SQL 有一种特殊的方式来处理夏令时,它会忽略夏令时开始发生的确切日期和时间。就我而言,那是 10 月 20 日,当天凌晨 00 点到凌晨 1 点之间的所有记录根本无法被服务器识别,即使格式正确,因为它们只是“不存在”(在此处查看更多信息) . 这影响了所有时间戳记录,而不仅仅是夏令时的细节。

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

SET time_zone='+00:00';

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

于 2014-07-19T14:06:11.680 回答