Использование LOAD DATA для импорта данных JSON и определения типа данных даты при импорте - PullRequest
0 голосов
/ 02 мая 2019

Я импортирую данные JSON в sql и хотел бы преобразовать удобочитаемые данные даты в формат гггг-мм-дд.

Вот поток:

Я использую следующий файл json, хранящийся в /home/name/json_data/sample.json

{
    "price": null,
    "sale_list": [
        {
            "buyer": "SmackMe089",
            "date": "April 29th 2019 21:20:50",
            "id": "1234",
            "item_desc": ""
        }
}

Создайте таблицу в mysql:

CREATE TABLE example_table (
         id INT NOT NULL AUTO_INCREMENT,
         json_data JSON NOT NULL,
         PRIMARY KEY (id)
);

Загрузка файла в mysql:

LOAD DATA INFILE '/home/name/json_data/sample.json' INTO TABLE example_table (json_data);

При загрузке данных в таблицу возможно преобразовать данные даты в гггг-мм-дд?При запросе я могу назначить типы данных столбцам, но не уверен, как правильно преобразовать данные даты.Это можно сделать во время запроса или во время импорта?

EX:

select test.* from example_table,
JSON_TABLE(json_data, '$.sale_list[*]' COLUMNS (
buyer VARCHAR(40) PATH '$.buyer',
date VARCHAR(40) PATH '$.date',
id VARCHAR(40) PATH '$.id',
item_desc VARCHAR(40) PATH '$.item_desc'
) ) test;

1 Ответ

1 голос
/ 02 мая 2019

Я понимаю, что вы используете MySQL 8.0.4 или выше, потому что вы используете функцию JSON_TABLE () .

Один из вариантов - использовать функцию STR_TO_DATE :

SELECT
  `test`.`buyer`,
  STR_TO_DATE(`test`.`date`, '%M %D %Y') `date`,
  `test`.`id`,
  `test`.`item_desc`
FROM
  `example_table`,
  JSON_TABLE(
    `json_data`,
    '$.sale_list[*]' COLUMNS(
      `buyer` VARCHAR(40) PATH '$.buyer',
      `date` VARCHAR(40) PATH '$.date',
      `id` VARCHAR(40) PATH '$.id',
      `item_desc` VARCHAR(40) PATH '$.item_desc'
    )
  ) `test`;

См. dbfiddle .

UPDATE

В ЗАГРУЗИТЬ ДАННЫЕ можно преобразовать дату в выбранный формат, однако предложение несколько сложнее, и формат файла для загрузки должен поддерживать структуру. Кроме того, в новом формате даты такая информация, как время, будет потеряна:

LOAD DATA INFILE '/path/to/file/sample.json'
INTO TABLE `example_table` (@`json`)
SET `json_data` =
  JSON_REPLACE(
    @`json`,
    '$.sale_list[0].date',
    LEFT(
      STR_TO_DATE(
        JSON_UNQUOTE(
          JSON_EXTRACT(
            @`json`,
            '$.sale_list[0].date'
          )
        ),
      '%M %D %Y %H:%i:%s'),
    10)
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...