重新格式化输入的DATE数据

时间:2019-10-23 18:09:15

标签: mysql datetime mariadb preprocessor

我有一个相当大的文件(超过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的用法,但是我没有找到正确的语法来使用。

欣赏任何想法。

1 个答案:

答案 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');

我认为答案就在那里。希望这个工作示例可以对其他人有所帮助。