MySQL конвертировать дату ISO в дату и время - PullRequest
0 голосов
/ 17 марта 2020

У меня есть таблица с 20 000 000 строк со столбцом «время», которая была сохранена в виде строки (type = TEXT), и содержит значения 3 различных форм:

  • NULL
  • DateTime: 2020-01-01 15: 23: 45
  • ISO Даты: 2020-01-01T15: 23: 45.000Z

Есть ли способ в MySQL преобразовать все даты ISO в правильный формат DateTime? Когда я пытаюсь привести их к «Datetime», запрос не выполняется. Когда я пытаюсь изменить таблицу, запрос не выполняется. Когда я пытаюсь изменить таблицу, я получаю:

Неправильное значение даты и времени: '2020-02-13T08: 10: 02.000Z' для столбца 'время' в строке 668290

Мне известно, что я могу запрашивать все строки из БД на каком-либо другом языке, конвертировать его туда, а затем обновлять строку за строкой, я просто хочу убедиться, что в * нет простого способа сделать это напрямую SQL.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Я предполагаю, что это одноразовая коррекция данных, поэтому не нужно автоматизировать и скорость не учитывается.

Учитывая это, я бы начал с изменения таблицы таким образом, чтобы поле длиной 19 символов. Это обрезает ненужные элементы .000Z из записей меток дат ISO.

После этого я выполню запрос на обновление, чтобы заменить символ T пробелом. Он всегда находится в одном и том же месте, поэтому что-то вроде этого:

UPDATE mytable set myfield = CONCAT(SUBSTRING(myfield, 0, 10), ' ', SUBSTRING(myfield, 11, 8))

Это обновит все записи, но правильные записи должны остаться такими же, как были.

Очевидно, запустите это сначала на небольшом выборочном наборе данных, чтобы убедиться, что он работает, прежде чем выбросить его в основную БД. Если БД велика, запуск может занять некоторое время.

2 голосов
/ 17 марта 2020

Поскольку .000Z одинаково для всех связанных строк:

Вы можете выполнить следующий запрос:

UPDATE MyTable
SET `Time` = REPLACE (REPLACE (`Time`, 'T', ' '), '.000Z', '')
WHERE `Time` IS NOT NULL

Эта вложенная замена проверяет столбец TEXT для значения и, если они найдены, заменяют их соответствующим пробелом или пробелом;

Следовательно:

  • NULL становится NULL
  • 2020-01-01 15:23:45 становится 2020-01-01 15:23:45 (не найдено замен)
  • 2020-01-01T15:23:45.000Z становится 2020-01-01 15:23:45

Таким образом, ISO становится формой DateTime, которую вы сможете затем без видимого преобразования преобразовать, изменив столбец введите с Text в DateTime.

MySQL Manaul - Замените

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