重新格式化输入 DATE 数据
Reformat input DATE data
我有一个相当大的文件(超过 200,000 条记录),我要将其插入到包含 59 列的 table 中。数据包含多个 DATETIME 字段。输入日期的格式为“10/06/2019 10:45:58”。如何将这些字段输入为 DATETIME(或者可能只是 DATE,因为 TIME 字段与我的目的无关)?
如果我将各种日期字段设置为键入 DATETIME,加载后这些字段将显示为 0000-00-00 00:00:00。那是因为数据库不知道如何处理输入格式。
我看到了两种不同的方法,但每种方法都有问题:
预处理:
我创建了一个脚本来使用 Regex 检测日期字段,并使用类似 Perl 的 DateTime::Format::DBI 将它们重新格式化为预期的格式。这里存在风险,因为记录包含自由格式的文本字段,其中可能包含嵌入的逗号和引号。仅仅因为规模,就很难确定 DATE 字段。
Post-处理:
创建日期字段为 VARCHAR 的 table 并使用 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 列指定输入数据的预期格式,这将使整个讨论变得毫无意义。我看到 提到在 CREATE TABLE 语句中使用 DATEFORMAT,但我没有找到正确的语法来使用。
感谢任何想法。
@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');
我想答案就在那里。希望这个工作示例能对其他人有所帮助。
我有一个相当大的文件(超过 200,000 条记录),我要将其插入到包含 59 列的 table 中。数据包含多个 DATETIME 字段。输入日期的格式为“10/06/2019 10:45:58”。如何将这些字段输入为 DATETIME(或者可能只是 DATE,因为 TIME 字段与我的目的无关)?
如果我将各种日期字段设置为键入 DATETIME,加载后这些字段将显示为 0000-00-00 00:00:00。那是因为数据库不知道如何处理输入格式。
我看到了两种不同的方法,但每种方法都有问题:
预处理:
我创建了一个脚本来使用 Regex 检测日期字段,并使用类似 Perl 的 DateTime::Format::DBI 将它们重新格式化为预期的格式。这里存在风险,因为记录包含自由格式的文本字段,其中可能包含嵌入的逗号和引号。仅仅因为规模,就很难确定 DATE 字段。
Post-处理:
创建日期字段为 VARCHAR 的 table 并使用 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 列指定输入数据的预期格式,这将使整个讨论变得毫无意义。我看到
感谢任何想法。
@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');
我想答案就在那里。希望这个工作示例能对其他人有所帮助。