【问题标题】:Using LOAD DATA to import JSON data and specify date data type on import使用 LOAD DATA 导入 JSON 数据并在导入时指定日期数据类型
【发布时间】: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;

【问题讨论】:

    标签: mysql json date loaddata


    【解决方案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)
      );
    

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 2015-07-31
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多