使用 LOAD DATA 导入 JSON 数据并在导入时指定日期数据类型

Posted

技术标签:

【中文标题】使用 LOAD DATA 导入 JSON 数据并在导入时指定日期数据类型【英文标题】:Using LOAD DATA to import JSON data and specify date data type on import 【发布时间】:2019-09-20 14:07:22 【问题描述】:

我在 sql 中导入 JSON 数据,并希望将人类可读的日期数据转换为 yyyy-mm-dd 格式。

流程如下:

我正在使用/home/name/json_data/sample.json下存储的以下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);

当将数据加载到表中时,可以将日期数据转换为 yyyy-mm-dd?在查询时,我可以为列分配数据类型,但不确定如何正确转换日期数据。这可以在查询期间或导入期间完成吗?

前:

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】:

我了解到您使用的是 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。

更新

在LOAD DATA 中,可以将日期转换为选定的格式,但是,这句话有点复杂,要加载的文件格式必须保持结构。另外,在新的日期格式中,时间等信息会丢失:

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

【讨论】:

以上是关于使用 LOAD DATA 导入 JSON 数据并在导入时指定日期数据类型的主要内容,如果未能解决你的问题,请参考以下文章

mysql导入数据load data infile用法整理

MYSQL 使用 LOAD DATA INFILE 从 csv 导入数据

MYSQL 使用 LOAD DATA INFILE 从 csv 导入数据

使用load data infile来导入导出数据

MySQL使用load data导入数据错误的一个场景

MySQL使用load data导入数据错误的一个场景