Переформатировать ввод данных DATE - PullRequest
1 голос
/ 23 октября 2019

У меня довольно большой (более 200 000 записей) файл, который я вставляю в таблицу с 59 столбцами. Данные содержат несколько полей DATETIME. Даты ввода находятся в форме «10/06/2019 10:45:58». Как я могу ввести эти поля как DATETIME (или, может быть, просто DATE, так как поле TIME не имеет значения для моих целей)?

Если я задаю для различных полей даты тип DATETIME, поля отображаются как 0000-00-00 00:00:00 после загрузки. Это потому, что база данных не знает, что делать с форматом ввода.

Я вижу два разных подхода, но у каждого есть проблемы:

Предварительная обработка :
Я создаю сценарий для обнаружения полей даты с помощью Regex и переформатирую их вожидаемая форма, использующая что-то вроде Perl's DateTime :: Format :: DBI. Здесь есть риск, поскольку записи включают в себя поля TEXT произвольной формы, которые могут содержать запятые и кавычки. Положительная идентификация полей DATE затруднена только из-за масштаба.

Постобработка :
Создайте таблицу с полями даты как VARCHAR и используйте функцию SQL STR_TO_DATE, чтобы заполнить столбцы даты.

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;

Третий вариант?
Мне было интересно, могу ли я указать ожидаемый формат входных данных для этих столбцов DATE в операторе CREATE TABLE, который будет отображатьвесь разговор спорный. Я видел другой вопрос , в котором упоминается использование DATEFORMAT в операторе CREATE TABLE, но я не нашел правильный синтаксис для использования.

Цени любые мысли.

1 Ответ

1 голос
/ 24 октября 2019

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

Я подумал, что ответ был там. Надеюсь, этот рабочий пример поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...