在MySQL导入文件中超过60秒或几分钟

时间:2015-04-13 19:00:49

标签: mysql load-data-infile str-to-date

我目前正在将CSV文件导入MySQL表格,其中包含以下行:

2/28/2015 8:46:30 PM,1:40,2,1234567,1435.6071
2/28/2015 8:45:58 PM,0:19,1,1234568,1435.6436

它基本上是来自PBX的CDR。但是,我没有信息源的控制权,所以我只是按原样收到这个文件。到目前为止,列是:

DATE,DURATION,MINUTES,PHONE,BALANCE

我使用LOAD DATA INFILE导入我的数据,如下所示:

LOAD DATA INFILE '10811.csv'
INTO TABLE cdr
fields terminated by ','
lines terminated by '\n'
(@col1, @col2, MINUTES, PHONE, BALANCE)
set DATE = STR_TO_DATE(@col1,'%m/%d/%Y %h:%i:%s %p'),
DURATION = STR_TO_DATE(@col2,'%i:%s'),
CARDID = 10811;

CARDID只是存储源文件名的字段

问题是:DURATION给了我一些问题。请参阅:有些行是这样的:

2/28/2015 8:46:30 PM,140:28,141,1234569,1435.6071

这意味着,持续时间为140分28秒;但是,如果我存储该值,它会给我一个错误。这是因为:

> SELECT str_to_date('140:28','%i:%s') AS DATE;
+------+
| DATE |
+------+
| NULL |
+------+

因为%i预计分钟在00到59之间。

我尝试过使用SEC_TO_TIME,但也失败了(只需要第一个号码):

> SELECT sec_to_time('140:28') AS DATE;
+----------+
| DATE     |
+----------+
| 00:02:20 |
+----------+

我如何修改我的查询(请,只是SQL)以正确的格式存储该时间?

2 个答案:

答案 0 :(得分:0)

与小时格式说明符“%H”和“%k”接受大于0-23的值不同,没有分钟格式说明符接受大于0-59的值。

您可以使用MYSQL提供的字符串函数将DURATION字段转换为正确的格式(如140:28 - > 2:20:28)。

但是更好的做法是使用其他工具/语言/脚本,这比字符串操作中的MYSQL字符串函数更有效,更容易进行字符串转换。

答案 1 :(得分:0)

我设法通过字符串操作来解决这个问题。它不是最优雅的解决方案,但嘿!它有效!

LOAD DATA INFILE '10811.csv'
INTO TABLE cdr
fields terminated by ','
lines terminated by '\n'
(@col1, @col2, MINUTES, PHONE, BALANCE)
set DATE = STR_TO_DATE(@col1,'%m/%d/%Y %h:%i:%s %p'),
DURATION = SEC_TO_TIME(SUBSTRING_INDEX(@col2,':',1)*60+SUBSTRING_INDEX(@col2,':',-1))
CARDID = 10811;