我将一个日期以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
我在做什么错?谁能帮我解决这个问题?
预先感谢
答案 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 |
但是,在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 |