encontrar tiempo entre la gama de campo JSON en MySql

Hebert Lima:

Tengo una availabilitytabla con la siguiente estructura

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

¿Cómo puedo buscar un tiempo específico entre los campos de apertura y cierre?

Lo intenté:

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

pero devuelve 0 resultados

Bill Karwin:

Trabajar con JSON está lleno de trampas.

En primer lugar, si JSON_EXTRACT (), no obtiene una cadena o un número, se obtiene otro documento JSON, a pesar de que es sólo una única cadena.

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

Por lo que también necesitará Unquote el valor para obtener un valor escalar sin formato. Lea sobre JSON_UNQUOTE () .

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

También puede utilizar la ->>abreviatura para hacer lo mismo que el extracto y fin de la cita:

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

El otro problema con la consulta es que tiene condiciones que no son verdad para sus valores de datos. Vamos a por qué muestran:

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

Ninguno de los valores cercanos que tiene en sus datos son menores que el valor que se les está comparando a.

En la consulta, desea filas en las que tanto la apertura y el cierre pasan las condiciones que le has dado. Tal vez nos referimos a utilizar O?

De todos modos, si cambia el valor que se está comparando a, se encuentra una fila en la que ambos pasan.

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

Supongo que te gusta

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