Гомогенизировать поле с разными форматами даты в Mysql

0

Я работаю с Workbench Mysql.

У меня есть огромная база данных в csv, которая содержит, среди прочего, 3 столбца с разными форматами дат. Чтобы загрузить этот файл csv в мою базу данных, я должен установить три столбца даты как текст, иначе он не будет загружать их должным образом. Вот пример моих данных:

inDate,                   outDAte
19-01-10,                 02-02-10
04-01-11 12:02,           2011-01-11 11:31
29-01-11 6:57,            29-03-2010
30-03-10,                 01-04-2010
2012-12-03 05:39:27.040,  12-12-12 17:04
2012-12-04 13:47:01.040,  29-11-12

Я хочу их гомогенизировать и сделать 2 столбца каждого из них только с "датой" и другими только с "временем".

Я пробовал работать с "регулярными выражениями" и "case".
Когда я использовал "reg-выражения", я дал null и "case" дал мне "усеченное неправильное значение".

Я попытался найти что-то подобное в Интернете. Я обнаружил, что люди сталкиваются с подобными проблемами, но с двумя форматами дат не так много разных форматов, как я:

Я действительно новичок в этом, и я не знаю, как написать так много исключений в mysql.

  • 0
    02-02-10 в 2002 году? Или это в 2010 году? То есть что делать с неоднозначными ценностями?
  • 0
    да уж! это тоже сложно !! К счастью, я знаю, что диапазон данных за 2010-2012 гг. В противном случае нет возможности узнать это :(
Показать ещё 1 комментарий
Теги:
case

1 ответ

0
Лучший ответ

Загрузите CSV во временную таблицу; массировать значения в этой таблице; наконец, скопируйте в "реальную" таблицу.

В каждой таблице должно быть по 2 столбца; один для необработанного значения, поступающего из CSV; другой - DATETIME(3) (или независимо от того, какая будет санированная версия).

Сделайте один из них для каждого совершенно другого формата:

UPDATE tmp SET inDate = ...
           WHERE raw_inDate REGEXP '...';

WHERE могут потребоваться такие вещи, как AND LENGTH(inDate) = 8 и другие способы тестирования, отличные от REGEXP.

SUBSTRING_INDEX(inDate, '-',...) может быть удобной функцией для разделения даты.

Но, действительно, я бы предпочел написать код на Perl или на каком-то другом реальном языке программирования.

  • 0
    я уже попробовал это: % H:% i:% s ') END); # дает код ошибки 1411 неверное значение даты
  • 0
    и этот UPDATE dateDif устанавливает inDate = (СЛУЧАЙ, КОГДА ПОДПИСЫВАЕТСЯ (@inDate, 1, 10) REGEXP '^ ([0-9] {2}. [0-9] {2}. [0-9] {2}) $ 'THEN STR_TO_DATE (SUBSTRING (@inDate, 1, 10),'% d.% M.% Y ') WHEN SUBSTRING (@inDate, 1, 10) REGEXP' ^ ([0-9] {4} - [ 0-9] {2} - [0-9] {2}) $ 'THEN DATE (@inDate) ELSE NULL END); # нет ошибки, но дает нули
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню