从CSV导入(我的)SQL数据库时,是否可以将Unix时间戳自动转换为DATETIME列?

问题描述 投票:1回答:1

我创建了一个包含timestamp DATETIME列的表,我正在尝试从具有Unix时间戳行的CSV文件中导入数据。

但是,当我尝试使用DataGrip的CSV导入功能时,我得到了错误

1:1: conversion failed: "1394669640" to datetime
2:1: conversion failed: "1394670060" to datetime
3:1: conversion failed: "1394670480" to datetime
4:1: conversion failed: "1394670780" to datetime

也许dataGrip不是最好的工具,但这几乎是我所能做的,因为我没有直接访问运行数据库服务器的机器[*]。显然,如果我将列设置为INT,这是有效的。

有没有办法配置表,以便自动进行转换?


[*]我这样做,但DBMS在Docker容器内运行,所以,如果没有复制主机上的CSV文件,然后在容器内部,我就不能像LOAD DATA INFILE那样玩技巧并用FROM_UNIXTIME()设置列。

mysql csv datetime unix-timestamp
1个回答
0
投票

您可以使用LOAD DATA LOCAL INFILE将CSV文件加载到远程MySQL(即在docker容器内),而无需将CSV文件复制到容器中。

mysql> create table MyTable (timestamp DATETIME PRIMARY KEY);

mysql> load data local infile 'data.csv' into table MyTable (@dummy) 
    SET timestamp = FROM_UNIXTIME(@dummy);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from MyTable;
+---------------------+
| timestamp           |
+---------------------+
| 2014-03-13 00:14:00 |
| 2014-03-13 00:21:00 |
| 2014-03-13 00:28:00 |
| 2014-03-13 00:33:00 |
+---------------------+

请注意,需要在服务器上启用local-infile选项,以允许远程客户端以及客户端。要做上面的例子,我必须在我的服务器的local-infile=1中启用/etc/my.cnf,我还使用选项mysql --local-infile运行客户端。如果没有这两个选项,我会遇到这个非常令人困惑的错误:

错误1148(42000):此MySQL版本不允许使用命令

阅读https://dev.mysql.com/doc/refman/5.7/en/load-data-local.html了解详情。

© www.soinside.com 2019 - 2024. All rights reserved.