我有一个相当大的文件(超过200,000条记录),正在将其插入具有59列的表中。数据包含几个DATETIME字段。输入日期的格式为“ 10/06/2019 10:45:58”。如何输入这些字段作为DATETIME(或者可能只是DATE,因为TIME字段与我的目的无关)?
如果我将各种日期字段设置为DATETIME,则这些字段在加载后显示为0000-00-00 00:00:00。那是因为数据库不知道如何处理输入格式。
我看到两种不同的方法,但是每种方法都有问题:
预处理:
我创建了一个脚本,使用Regex检测日期字段,并使用Perl的DateTime :: Format :: DBI之类的格式将其重新格式化为期望的格式。这里存在风险,因为记录包含自由格式的TEXT字段,该字段可能包含嵌入式逗号和引号。仅凭规模,很难确定DATE字段。
后处理:
创建日期字段为VARCHAR的表,并使用STR_TO_DATE SQL函数填充日期列。
INSERT INTO mytable(DATELastDetected, DATEFirstDetected)
SELECT STR_TO_DATE(LastDetected, '%c/%e/%Y %H:%i'),
STR_TO_DATE(FirstDetected, '%c/%e/%Y %H:%i')
from mytable;
第三种选择?
我想知道是否可以在CREATE TABLE语句中为DATE列指定输入数据的预期格式,这将使整个讨论变得毫无意义。我已经看到another question在CREATE TABLE语句中提到了DATEFORMAT的用法,但是我没有找到正确的语法来使用。
欣赏任何想法。
答案 0 :(得分:1)
@ ben-personick对此发表了评论。这是我的Load语句的样子:
LOAD DATA INFILE '/opt/mysql/work/report.csv'
INTO TABLE `my_db`.`tbl_reportdata`
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1
LINES (`IP`,
[...]
`OS`,
@FirstDetectedVar,# This field is defined as DATETIME
@LastDetectedVar, # This field is defined as DATETIME
[...]
`Category`)
set
`FirstDetected` = str_to_date(@FirstDetectedVar, '%m/%d/%Y %H:%i'),
`LastDetected` = str_to_date(@LstDetectedVar, '%m/%d/%Y %H:%i');
我认为答案就在那里。希望这个工作示例可以对其他人有所帮助。