encontrar tempo entre array de campos de json em MySql

Hebert Lima:

I têm uma availabilitytabela com a seguinte estrutura

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

Como posso procurar um tempo específico entre os campos de abrir e fechar?

Eu tentei:

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

mas retorna 0 resultados

Bill Karwin:

Trabalhando com JSON está cheio de armadilhas.

Primeiro, se você JSON_EXTRACT (), você não obter uma string ou um número, você começa um outro documento JSON, embora um que é apenas uma única cadeia.

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

Então você também precisa unquote o valor para obter um valor escalar simples. Leia sobre JSON_UNQUOTE () .

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

Você também pode usar a ->>abreviação para fazer o mesmo que o extrato e fecha aspas:

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

O outro problema com sua consulta é que você tem condições que não são verdadeiras para seus valores de dados. Vamos mostrar-lhe porquê:

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 |
+------------+--------------+------------+--------------+

Nenhum dos valores próximos que você tem em seus dados são menos do que o valor que você está comparando-os.

Em sua consulta, você quer que as linhas em que tanto a aberta ea estreita passam as condições que você deu. Talvez você quis usar OR?

De qualquer forma, se você alterar o valor que você está comparando com, você pode encontrar uma linha onde ambos passagem.

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 |
+------------+--------------+------------+--------------+

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=351312&siteId=1
Recomendado
Clasificación