ВЫБЕРИТЕ JSON_EXTRACT(z2schedule,'$[*].start') как startDate из cpmdev_z2weekly_schedule
После запуска кода выше я получаю ответ как: -
Теперь, если я попытался сравнить каждое значение со значением времени, используя приведенный ниже код, но он не работает: -
SELECT JSON_EXTRACT(z2schedule,'$[*].start') as startDate from
cpmdev_z2weekly_schedule where
JSON_EXTRACT(z2schedule,CONVERT('$[*].start'),'TIME')>
'CONVERT('2022-11-02 13:10:00:000', TIME)
Мое требование состоит только в том, чтобы сравнивать каждое значение со значением времени и возвращать значение, только если значение больше заданного времени. Например, в таблице у меня есть данные как: -
[{"start":"09:00:00.000","end":"17:00:00.000"}]
[{"start":"10:00:00.000","end":"17:00:00.000"}]
[{"start":"11:00:00.000","end":"17:00:00.000"}]
Теперь мне нужна вся дата начала, которая больше 10:00:00. В приведенном выше случае он должен вернуться:
11:00:00.000
Показанный вами JSON представляет собой массив объектов. Когда вы используете $[*].start
, он возвращает массив JSON. Это не один раз. Вы можете увидеть квадратные скобки вокруг значения времени:
mysql> set @j = '[{"start":"09:00:00.000","end":"17:00:00.000"}]';
mysql> select json_extract(@j, '$[*].start') as times;
+------------------+
| times |
+------------------+
| ["09:00:00.000"] |
+------------------+
Квадратные скобки делают его недействительным в качестве значения времени.
mysql> select convert(json_extract(@j, '$[*].start'), time) as times;
+-------+
| times |
+-------+
| NULL |
+-------+
Поскольку в вашем массиве JSON, похоже, есть только один объект, вы можете использовать $[0]
, чтобы выбрать первый объект в массиве. Затем он возвращает одно строковое значение, которое можно преобразовать во время:
mysql> select convert(json_extract(@j, '$[0].start'), time) as time;
+----------+
| time |
+----------+
| 09:00:00 |
+----------+
Также обратите внимание, что тип данных, указанный в функции CONVERT()
, является ключевым словом, а не строкой в кавычках. То есть 'time'
неверно, просто используйте time
.
Если в вашем массиве JSON может быть более одного объекта, и вам нужно протестировать их все, вам следует использовать функцию JSON_TABLE().
Кстати, всех этих проблем можно было бы избежать, если бы вы сохраняли время начала и окончания в обычных строках и столбцах. Использование JSON усложняет разработку и оптимизацию многих запросов. Вам следует подумать о нормализации ваших данных, а не об использовании JSON.
Отображение некоторых образцов данных таблицы и образца желаемого набора результатов поможет вам получить ответы. Пожалуйста отредактируйте свой вопрос.