Даты JSONb: фактические даты внутри страны?

Я использую адаптер jdbc postgresql для переноса набора данных в поле jsonb (postgres 9.4).

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

Например, запись в поле properties jsonb выглядит так:

"founded_on": "Sep 1, 2012 12:00:00 AM",

Теперь я могу искать, скажем,

SELECT CAST(properties->>'founded_on' AS DATE

а также

SELECT extract('year' from cast(properties->>'founded_on' as timestamp))

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

Я мог бы создать индекс, в котором я привожу эти значения к датам и использую его для поиска, но это кажется несколько неэлегантным. Я действительно предпочел бы знать, что сохраненное значение является датой. Целые числа и числа с плавающей запятой кажутся их фактическими собственными значениями, а не строками, как в этих случаях:

shares_sold": 5900000,

"latitude": 33.561467,

Любая обратная связь высоко ценится.


person Will Kessler    schedule 26.03.2015    source источник


Ответы (1)


JSON не имеет типа «дата». Тип JSONB (добавлен в стр. 9.4) сопоставляется, но не распространяется на примитивные типы JSON. Видимое значение равно что это, текст.

Хотя индекс можно добавить к строковым свойствам, текущий формат «английская проза» не сможет участвовать в запросах диапазона, поскольку такие значения не упорядочены по датам.

Различные способы хранения упорядоченных дат с учетом ограничений примитивного типа.

(Проверки индекса равенства можно использовать, даже если диапазоны не могут ... при условии, что значения точно совпадают, что по-прежнему зависит от использования согласованного представления данных.)

При применении запроса диапазона по индексу (JSONB/GIN) преобразуйте значения DATE в соответствующий тип данных JSON (сопоставленный с целым числом, числом, текстом в Pg), используемый для свойства «дата»; не иначе.

При извлечении значений преобразуйте выбранный формат в DATE — это «нормально», так как это делается после запроса диапазона и «требуется», поскольку JSONB изначально не поддерживает даты и время.

person user2864740    schedule 26.03.2015
comment
Спасибо, этот ответ превосходен. Мы собираемся использовать unixtime везде. - person Will Kessler; 26.03.2015