将从 json 值中提取的字符串转换为返回 NULL 的日期

Converting string extracted from json value to date returning NULL

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

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

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

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

以上查询returns

"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

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

提前致谢

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

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

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 |

View on DB Fiddle


但是,在 5.7 及以上版本中,最好使用 JSON 函数来代替。我们可以使用Json_Extract()函数获取created_date键对应的值,并使用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 |

View on DB Fiddle