MySQL CSV导入:日期时间值

djmepvbi  于 2023-02-14  发布在  Mysql
关注(0)|答案(5)|浏览(172)

我一直在努力从. csv文件中导入日期时间值,这让我头疼不已。
下面是import语句。
LOAD DATA LOCAL INFILE 'myData.csv' INTO TABLEequity_last_importFIELDS 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日期时间格式。
任何帮助都将不胜感激。

eufgjt7s

eufgjt7s1#

我遇到了同样的问题。我通过更改CSV文件中日期列的格式以匹配MySQL日期时间格式来修复它。
1.在Excel中打开CSV。
1.突出显示该列。
1.右键单击该列。
1.单击Format Cells
1.选择Custom
1.在Type字段中使用yyyy/mm/dd hh:mm:ss
1.单击ok
我的CSV成功导入后,我改变了日期时间格式如上。

dfty9e19

dfty9e192#

数据文件中的日期已经是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数据高亮显示,并粘贴到我系统的/tmp文件夹中一个名为myData.csv的新文件中,然后连接到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文件有头文件吗?如果有,您可能需要在LOAD DATA INFILE命令中添加IGNORE 1 LINES,以通知MySQL跳过头文件。

hfyxw5xn

hfyxw5xn3#

拉我的头发了,这也是因为我没有在上述建议的方式进口。
解决方法:在导入表中创建了一个类型为“VARCHAR”的临时字段temp_date,并且加载数据时没有问题。然后我就可以对类型为date的date列执行更新。

update table
    set date = temp_date
30byixjq

30byixjq4#

我也有同样的问题,这是我的发现,我想它可能会帮助你
该问题与GMT冲突有关:我提取.csv文件的数据库是在GMT 00:00,所以没有夏令时。
我的本地服务器(也就是我试图插入.csv文件的服务器)默认运行在我的计算机(系统)GMT上,在我的情况下是GMT -3,这是受夏令时影响的。
SQL有一种特殊的方法来处理夏令时,它忽略了夏令时开始的确切日期和时间。在我的例子中,那是10月20日,服务器根本无法识别那一天00到凌晨1点之间的所有记录,即使格式是正确的,因为它们根本“不存在”(查看这里的更多信息)。这影响了所有的时间戳记录,而不仅仅是夏令时的细节。
我的解决方案是将本地服务器设置为GMT +00,然后使用以下命令创建新表并导入.csv

SET time_zone='+00:00';

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

vcudknz3

vcudknz35#

在Excel中打开CSV。突出显示该列。右键单击该列。单击“格式化单元格”。选择“自定义”。使用与SQL日期格式相同的格式yyyy-mm-dd单击“确定”并保存它对我来说工作正常

相关问题