使用 LOAD DATA 导入 JSON 数据并在导入时指定日期数据类型
Using LOAD DATA to import JSON data and specify date data type on import
我正在 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 中创建 table:
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);
将数据加载到 table 时是否可以将日期数据转换为 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 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中可以将Date转换为所选格式,但是语句稍微复杂一些,加载的文件格式必须保持结构。另外,在新的日期格式中,时间等信息会丢失:
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)
);
我正在 sql 中导入 JSON 数据,并希望将人类可读的日期数据转换为 yyyy-mm-dd 格式。
流程如下:
我正在使用存储在 /home/name/json_data/sample.json
{
"price": null,
"sale_list": [
{
"buyer": "SmackMe089",
"date": "April 29th 2019 21:20:50",
"id": "1234",
"item_desc": ""
}
}
在 mysql 中创建 table:
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);
将数据加载到 table 时是否可以将日期数据转换为 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 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中可以将Date转换为所选格式,但是语句稍微复杂一些,加载的文件格式必须保持结构。另外,在新的日期格式中,时间等信息会丢失:
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)
);