MySQL - CAST json извлекает данные как время - PullRequest
0 голосов
/ 29 января 2019

Есть ли способ сравнить часы при извлечении из данных типа JSON?

В настоящее время у меня есть этот запрос:

SELECT * FROM
(SELECT clinics.id as cid, clinics.lat, clinics.lng, clinics.opening_hours,
clinics.logo, clinics.address, clinics.city, clinics.state, clinics.name, clinics.description,
clinics.zip, clinics.phone_number, clinics.email, clinics.url, clinics.bookmark_url,
clinics.marker, timezone,
countries.full_name AS country,
(6378 * acos(
cos(radians(-33.8688197)) * cos(radians(lat)) *
cos(radians(lng) - radians(151.2092955)) +
sin(radians(-33.8688197)) * sin(radians(lat))))
AS distance
FROM clinics
JOIN countries ON countries.id = clinics.country_id
LEFT JOIN clinics_services ON clinics.id = clinics_services.clinic_id
WHERE CAST(JSON_EXTRACT(`opening_hours`, '$."wednesday-to"') as time) > CAST('09:00' as time)
GROUP BY clinics.id
) AS distances
WHERE distance < 5
ORDER BY distance ASC

Если я запускаю этот запрос, я получаю правильные результаты:

SELECT JSON_EXTRACT(`opening_hours`, '$."wednesday-to"') FROM clinics

(результаты):

"17:30"
"19:00"
"12:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"19:00"
"18:00"
"19:00"
"18:00"
"18:00"
"18:00"
"18:00"
"18:00"
"19:00"

Но если я попытаюсь привести его ко времени (с помощью этого запроса), я получу NULL:

SELECT CAST(JSON_EXTRACT(`opening_hours`, '$."wednesday-to"') as TIME) FROM clinics

Что я делаю не так?

1 Ответ

0 голосов
/ 29 января 2019

Кажется, @BillKarwin прав.Вам нужно обернуть JSON_EXTRACT с JSON_UNIQUOTE.

Цепочка JSON_EXTRACT с CAST или STR_TO_DATE завершится неудачно

https://www.db -fiddle.com / f /nomb47TQ2Rxaw5MGc1WtSs / 0

SELECT CAST(JSON_UNQUOTE(JSON_EXTRACT('{"hour":"10:00"}','$.hour')) as time) > CAST('09:00' as time);

В вашем случае:

...
WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(`opening_hours`, '$."wednesday-to"')) as time) > CAST('09:00' as time)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...