MySQL CSV导入 - 如果时间戳有毫秒,则输入日期00:00:00?

时间:2011-10-26 14:30:59

标签: mysql csv mysqlimport

我目前有大量的CSV要导入MySQL数据库。这些文件包含每条记录的时间戳,格式为(例如):

2011-10-13 09:36:02.297000000

我知道MySQL错误#8523,它表示不支持在datetime字段中存储毫秒。尽管如此,我还是希望datetime字段在秒后截断记录,而不是输入为空白。

我已将问题缩小到毫秒(而不是csv的格式化等),因为

2011-10-13 09:36:02

正确导入。

有人建议我可以在没有零的情况下导入这些数据吗?我有太多的CSV手动进入每个CSV并调整时间戳的长度/格式。

我应该指出,虽然毫秒是很好的,但它们对我的应用程序来说并不是必需的,所以我很乐意使用一种解决方案,允许我轻松截断数字并导入它们。

谢谢!

编辑:为了澄清,我使用以下命令导入CSV:

mysqlimport --fields-enclosed-by="" --fields-terminated-by="," --lines-terminated-by="\n" --columns=id,@x,Pair,Time -p --local gain [file].csv

导入记录的速度非常快 - 我导入大约50米,因此读取每一行并不是一个很好的选择。

2 个答案:

答案 0 :(得分:2)

我不知道你是如何导入CSV的,但我的方法是编写一个脚本(php / perl)来读取每个文件,将时间戳整理或修剪为秒并执行INSERT语句。 DATABASE。

这样的东西
<?php
$file=fopen("your.csv","r");
mysql_connect ($ip, $user, $pass);

while(!feof($file))
{
   $line = explode(',',fgets($file));
   mysql_query("INSERT INTO TABLE1 (ID, DATE) values (".$line[0].", ".substr($line[1],0,19).")");
}
fclose($file);
?>

从命令行执行此操作,它应该执行作业

答案 1 :(得分:0)

使用毫秒时不会导入,但它会在没有导入的情况下导入。所以你必须以这种或那种方式进行子串。 MySQL有各种字符串函数,例如SUBSTRING - 你可以使用它,因为你需要每次在完全相同的位置剪切那些毫秒。

但是,这将在执行查询时使用。如果您无法修改查询,由于它以某种方式自动化,您可以向流程添加一个步骤并首先更改数据,然后将其添加到数据库中。一个简单的脚本可以读取csv,更改它,再次写回来或直接执行查询。