超过60秒钟或几分钟MySQL中导入文件(More than 60 seconds or minut

2019-10-22 15:27发布

我目前正在导入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中仅仅是一个存储我的源文件名域

问题是:持续时间是给我的问题。 请参阅:有些线路是这样的:

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 |
+------+

因为我%预计00和59分钟之间。

我试着用SEC_TO_TIME,但也失败了(它只是需要第一号):

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

我怎么能修改我的查询(请,只是SQL)存储在正确格式的时间?

Answer 1:

不同于有小时格式指定符“%H”和“%K”接受的值比范围0-23较大,没有分钟格式说明接受比范围0-59更大的值。

您可以使用MySQL提供的字符串函数来持续时间字段转换成合适的格式(如140:28 - >二时20分28秒)。

但更好的做法是使用其他工具/语言/文字,这比字符串操作MySQL的字符串函数更高效,更容易,做字符串转换。



Answer 2:

我已经成功地与一个字符串操作解决这个问题。 这不是最完美的解决方案,但是,嘿! 有用!

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;


文章来源: More than 60 seconds or minutes in MySQL import file