найти время между json массивом полей на MySql - PullRequest
1 голос
/ 18 марта 2020

У меня есть таблица availability со следующей структурой

| id | weekday | interval                                     |
| 1  |  0      | {"open":"1583055000","close":"1583087400"}   |
| 2  |  0      | {"open":"1583069400","close":"1583086200"}   |

Как мне найти конкретное c время между полями открытия и закрытия?

Я пытался:

select * from availabilities where json_extract(`interval`, "$.open") > 1583063400 and json_extract(`interval`, "$.close") < 1583063400;

но возвращает 0 результатов

1 Ответ

0 голосов
/ 18 марта 2020

Работа с JSON полна ловушек.

Во-первых, если вы JSON_EXTRACT (), вы не получите строку или число, вы получите еще один JSON документ, хотя тот, который только одна строка.

mysql> select json_extract(`interval`, '$.open') from availabilities;
+------------------------------------+
| json_extract(`interval`, '$.open') |
+------------------------------------+
| "1583055000"                       |
| "1583069400"                       |
+------------------------------------+

Так что вам также нужно заключить в кавычки значение, чтобы получить простое скалярное значение. Прочитайте о JSON_UNQUOTE () .

mysql> select json_unquote(json_extract(`interval`, '$.open')) from availabilities;
+--------------------------------------------------+
| json_unquote(json_extract(`interval`, '$.open')) |
+--------------------------------------------------+
| 1583055000                                       |
| 1583069400                                       |
+--------------------------------------------------+

Вы также можете использовать стенографию ->>, чтобы сделать то же самое, что и извлечь и удалить кавычки:

mysql> select `interval`->>'$.open' from availabilities
+-----------------------+
| `interval`->>'$.open' |
+-----------------------+
| 1583055000            |
| 1583069400            |
+-----------------------+

Другой Проблема с вашим запросом состоит в том, что у вас есть условия, которые никогда не выполняются для ваших значений данных. Давайте покажем вам, почему:

select
  open, open > 1583063400 as gt1583063400,
  close, close < 1583063400 as lt1583063400
from (
  select
    json_unquote(json_extract(`interval`, '$.open')) as open,
    json_unquote(json_extract(`interval`, '$.close')) as close
  from availabilities
) as t

+------------+--------------+------------+--------------+
| open       | gt1583063400 | close      | lt1583063400 |
+------------+--------------+------------+--------------+
| 1583055000 |            0 | 1583087400 |            0 |
| 1583069400 |            1 | 1583086200 |            0 |
+------------+--------------+------------+--------------+

Ни одно из значений закрытия, которые у вас есть в ваших данных, не меньше, чем значение, с которым вы сравниваете их.

В вашем запросе вам нужны строки, в которых как открытый, так и закрытый проходят условия, которые вы дали. Может быть, вы хотели использовать OR?

В любом случае, если вы измените значение, с которым сравниваете, вы можете найти одну строку, где оба проходят.

select
  open, open > 1583063400 as gt1583063400,
  close, close < 1583087200 as lt1583087200
from (
  select
    json_unquote(json_extract(`interval`, '$.open')) as open,
    json_unquote(json_extract(`interval`, '$.close')) as close
  from availabilities
) as t

+------------+--------------+------------+--------------+
| open       | gt1583063400 | close      | lt1583087200 |
+------------+--------------+------------+--------------+
| 1583055000 |            0 | 1583087400 |            0 |
| 1583069400 |            1 | 1583086200 |            1 |
+------------+--------------+------------+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...