我使用postgresql jdbc适配器将一堆数据迁移到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,
任何反馈都受到高度赞赏。
答案 0 :(得分:15)
JSON没有" date"类型。 JSONB类型(在Pg 9.4中添加)映射但does not extend upon JSON primitive types.看到的值是文本。
虽然可以在字符串属性上添加索引,但当前的英文散文"格式将无法参与范围查询,因为这些值在日期上排序不正确。
在给定原始类型限制的情况下,存储有序日期的不同方式。
具体ISO 8601 variation(具有相同的时区);文本
UNIX time或" JavaScript时间"毫秒;整数
Julian Day(参见'J' date format);数字
(即使范围不能,也可以使用等式索引探测器......如果值完全匹配,仍然需要使用一致的数据表示。)
在(JSONB / GIN)索引上应用范围查询时,将DATE值转换为用于" date"的相应JSON数据类型(映射到整数,数字,Pg中的文本)。属性;不是其他方式。
在获取值时,将所选格式转换为日期 - 它可以“正常”#39;因为这是在范围查询之后完成的,并且需要'因为JSONB本身不支持日期或时间。