Преобразование строки, извлеченной из значения json, в дату, возвращающую NULL - PullRequest
0 голосов
/ 27 ноября 2018

Я сохраняю дату в одном поле БД в формате json.Значение json выглядит следующим образом:

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

Я хочу извлечь created_date из json через sql и получаю его с помощью следующего запроса.

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 голосов
/ 27 ноября 2018

Дата, возвращаемая после операций 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 |

Просмотр на БД Fiddle


Однако в версии 5.7 и выше было бы лучше использовать функции JSON.Мы можем использовать функцию Json_Extract(), чтобы получить значение, соответствующее клавише created_date, и использовать функцию Str_To_Date().

Query # 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 |

Просмотр на БД Fiddle

0 голосов
/ 27 ноября 2018

Ваш код также включает ".Внесите это небольшое изменение в свой код, чтобы исключить их:

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