Задать вопрос
Paka
@Paka

Как найти дни рождения в json наборе?

В базе данных хранятся дни рождения детей в json формате, например

`user`.`children` = '["2018-08-15","2018-10-23","2012-06-09"]'

Как найти пользователей у которых есть дети с днем рождения +- 7 дней от текущей даты?
  • Вопрос задан
  • 191 просмотр
Подписаться 2 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Лучше детей писать в отдельную таблицу.
А если очень хочется, то только так колхозить:
-- MySQL
select u.user_id, child_bdays.bday
  from user u,
        JSON_TABLE(u.children, '$[*]' COLUMNS (
                bday VARCHAR(10)  PATH '$'
         )) child_bdays
       where STR_TO_DATE(child_bdays.bday, "%Y-%m-%d") >= DATE(now() - INTERVAL 7 DAY)
         and STR_TO_DATE(child_bdays.bday, "%Y-%m-%d") <= DATE(now() + INTERVAL 7 DAY);

-- MariaDB
select u.user_id, JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')) as bday
  from user u,
     (select 0 idx union select 1 union select 2 union
      select 3 union select 4 union select 5 union
      select 6 union select 7 union select 8 union
      select 9 union select 10 union select 11) idx_table /* впомогательная выборка для генерации индексов в диапазоне 0...11 */
  where idx_table.idx < json_length(u.children) /* отсекаем обращения к несуществующим индексам элементов в JSON*/
    and STR_TO_DATE(JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')), "%Y-%m-%d") >= DATE(now() - INTERVAL 7 DAY)
    and STR_TO_DATE(JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')), "%Y-%m-%d") <= DATE(now() + INTERVAL 7 DAY)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы