#sql #json #postgresql #date
Вопрос:
У меня есть поле в моей базе данных PSQL с этими данными:
{
"1":{
"wp_post_id":137840,
"sync_at":{
"date":"2021-02-23 22:02:35.958325",
"timezone_type":3,
"timezone":"Europe/Berlin"
}
},
"3":{
"wp_post_id":773,
"sync_at":{
"date":"2021-05-25 16:17:14.322988",
"timezone_type":3,
"timezone":"Europe/Berlin"
}
}
}
Я пытаюсь искать записи с sync_at
датой ниже другой, но безуспешно…
Может быть, мой формат поля не подходит?!
Комментарии:
1. Вы хотите знать, соответствует ли какая-либо из записей условию, или вы хотите извлечь только те части JSON, которые соответствуют?
2. Я хочу знать, соответствует ли хотя бы одна запись поля условию (sync_at
3. Похоже, вы сбрасываете объект php datetime как есть в json, а затем пытаетесь выполнить математику даты с помощью pgsql. Было бы лучше, если бы вы сохранили что-то, что обе платформы могли бы понять, например, временные метки Unix или дату и время, преобразованные в utc
4. Это было бы намного проще с правильно нормализованной моделью данных
Ответ №1:
Самым простым способом сделать это был бы запрос JSONPATH (доступен с версии 12).:
WHERE jsoncol @@ '$.*.sync_at.date < "2020-06-01 00:00:00"'
Запрос прост, но нет способа сделать его быстрым с помощью индекса.