重新格式化输入的DATE数据

问题描述 投票:1回答:1

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

欣赏任何想法。

mysql datetime mariadb preprocessor
1个回答
0
投票

@@ 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');

我想答案就在那里。希望这个工作示例可以帮助其他人。

© www.soinside.com 2019 - 2024. All rights reserved.