Запрос записей до даты от даты элемента JSON в столбце JSON в MySQL - PullRequest
0 голосов
/ 08 января 2020

Я запрашиваю из поля JSON в базе данных MySQL, которое пока работает нормально. Это дает мне записи. Но моя проблема в том, что я не могу выбрать, где дата элемента в строке JSON предшествует определенной дате. Кажется, он дает мне записи до и после указанной даты, что, очевидно, не работает. Вот код, который у меня есть ниже: -

select 
user_id, 
json_extract(user_profile, "$.gender") as gender, 
json_extract(user_profile, "$.dateofbirth") as dateofbirth
from user_profiles 
where json_extract(user_profile, "$.gender") = "Female" 
and json_extract(user_profile, "$.dateofbirth") < "06/15/1988"

Я рассмотрел вопрос об использовании, я подумал об использовании DATE_FORMAT (), например: -

where json_extract(user_profile, "$.gender") = "Female"
date_format(json_extract(user_profile, "$.dateofbirth"), "%d/%m/%Y") < "06/15/1988"

, но в результате у меня просто не осталось записей , Есть ли способ сделать это, чтобы MySQL мог понять формат даты из строки JSON, которую я запрашиваю?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Если предположить, что даты в документе json хранятся в формате dd/mm/yyyy, то вы хотите:

where 
    json_unquote(user_profile->"$.gender") = 'Female'
    and str_to_date(json_unquote(user_profile->"$.dateofbirth"), '%d/%m/%Y') < '1988-06-15'

Или:

where 
    json_unquote(user_profile->"$.gender") = 'Female'
    and str_to_date(user_profile->"$.dateofbirth", '"%d/%m/%Y"') < '1988-06-15'

str_to_date() преобразует форматированный строка в date, которую затем можно сравнить с фиксированной датой.

Примечание: MySQL понимает обозначение ->, которое можно использовать как ярлык для json_extract().

0 голосов
/ 08 января 2020

Это, кажется, имеет больше смысла из ответа от GMB. Большое спасибо. Я все еще не получал никаких записей, но мне удалось заставить его работать из того, что предоставил GMB, добавив json_unquote () из следующего поста Stackoverflow: Сбой цепочки JSON_EXTRACT с CAST или STR_TO_DATE

The SQL теперь выглядит так: -

select 
user_id, 
json_unquote(user_profile->'$.gender') as gender, 
json_unquote(user_profile->'$.dateofbirth') as dateofbirth
from tipanel.user_profiles
where 
user_profile->"$.gender" = 'Female'
and str_to_date(json_unquote(user_profile->'$.dateofbirth'), "%d/%m/%Y") < '1988-06-15';

Комментарии приветствуются, если это можно сделать лучше.

...