тестовый запрос
select jsonb_path_query_first_tz(
'[
{"dt":"2022-03-23T01:27:04.135+05:00"},
{"dt":"2022-03-23T01:27:31.690+05:00"},
{"dt":"2022-03-23T01:27:55.543+05:00"}
]'::jsonb,
'$[*] ? (@.dt.datetime() == $test.datetime())'::jsonpath,
'{"test":"2022-03-23T01:27:31.690+05:00"}'::jsonb
)
хотя работает без .datetime() :
select jsonb_path_query_first_tz(
'[
{"dt":"2022-03-23T01:27:04.135+05:00"},
{"dt":"2022-03-23T01:27:31.690+05:00"},
{"dt":"2022-03-23T01:27:55.543+05:00"}
]'::jsonb,
'$[*] ? (@.dt == $test)'::jsonpath,
'{"test":"2022-03-23T01:27:31.690+05:00"}'::jsonb
)
во втором случае тупо сравнение как текст идет, так что ничего удивительного
На .690 срубается. (В 14, кстати, тожэ). Подозреваю, что так сделали из-за того, что стандарт iso8601 требует соглашэния на точное количество цыфр в дробной части — но не указывает, сколько их должно быть. (Добавьте шаблон — и должно заработать).
то что с текстов не удивительно - это понятно)) а вот почему .datetime() не отработала не понятно
а можете поставить вашу таймзону в тест, а не +5 во всех данных.
да, так заработало: select jsonb_path_query_first_tz( '[ {"dt":"2022-03-23T01:27:04.135+05:00"}, {"dt":"2022-03-23T01:27:31.690+05:00"}, {"dt":"2022-03-23T01:27:55.543+05:00"} ]'::jsonb, '$[*] ? (@.dt.datetime("YYYY-MM-DD\"T\"HH24:MI:SS.MSTZH:TZM") == $test.datetime("YYYY-MM-DD\"T\"HH24:MI:SS.MSTZH:TZM"))'::jsonpath, jsonb_build_object('test',to_char('2022-03-23T01:27:31.690+05:00'::timestamptz,'YYYY-MM-DD"T"HH24:MI:SS.MSTZH:TZM')) )
вот так работает select jsonb_path_query_first_tz ('["2015-08-01 12:00:00+05"]', '$[*] ? (@.datetime() == "2015-08-01 12:00:00+05".datetime())')
Обсуждают сегодня