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

时间:2018-11-27 12:27:12

标签: mysql json datetime string-to-datetime

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

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

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

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

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

预先感谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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 |

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