0

我在一个 db 字段中以 json 格式保存日期。json 值如下所示:

[{"key":"jkajdajsdiajsdik"},{"created_date":"2018-01-17 15:51:23"}]

我想created_date通过 sql 从 json 中提取,并通过以下查询获取它。

select SUBSTRING_INDEX(SUBSTRING_INDEX(testjson, 'created_date\":', -1),'}',1) as created_date from test 

上面的查询返回

"2018-01-17 15:51:23"

现在我正在尝试将此返回的字符串转换为日期。

select STR_TO_DATE(SUBSTRING_INDEX(SUBSTRING_INDEX(testjson, 'created_date\":', -1),'}',1),'%Y-%m-%d %H:%i:%s') as created_date from test 

但这是返回 NULL。当我尝试使用样品时

SELECT STR_TO_DATE(" 2018-01-17 15:51:23",'%Y-%m-%d %H:%i:%s')

它的回归

2018-01-17 15:51:23

我究竟做错了什么?谁能帮我解决这个问题?

提前致谢

4

2 回答 2

2

您的代码还包括". 对您的代码进行这个小改动以排除它们:

select SUBSTRING_INDEX(SUBSTRING_INDEX(testjson, 'created_date":"', -1),'"}',1) as created_date from test
--                                                              ^        ^
-- -------------------------------------------------------------+        |
-- ----------------------------------------------------------------------+
于 2018-11-27T12:41:22.413 回答
1

操作后返回的日期Substring_Index()也包含双引号。我以为函数指定的格式添加了双引号Str_to_Date()

select STR_TO_DATE(
           SUBSTRING_INDEX(
               SUBSTRING_INDEX(testjson, 'created_date\":', -1),'}'
               ,1)
           ,'"%Y-%m-%d %H:%i:%s"') 
AS created_date from test 

结果

| created_date        |
| ------------------- |
| 2018-01-17 15:51:23 |

在 DB Fiddle 上查看


但是,在 5.7 及更高版本中,最好使用 JSON 函数。我们可以使用Json_Extract()函数来获取created_datekey对应的值,然后使用Str_To_Date()函数。

查询 #2

SET @j := '[{"key":"jkajdajsdiajsdik"},{"created_date":"2018-01-17 15:51:23"}]';

SELECT STR_TO_DATE(JSON_EXTRACT(@j, '$[*].created_date'), '["%Y-%m-%d %H:%i:%s"]') AS created_date;

结果

| created_date        |
| ------------------- |
| 2018-01-17 15:51:23 |

在 DB Fiddle 上查看

于 2018-11-27T12:41:57.483 回答