如何使用PostgreSQL在JSON中使用比较运算符(如BETWEEN子句)?

时间:2016-01-13 04:04:47

标签: javascript json postgresql

我有一个名为myfield的json列,它包含一个json文档:

{"createDate": 1448067864151, "id": 1, "name": "hello"}

我可以像这样提取createDate:

SELECT 
myfield->'createDate' AS dt
FROM mytable

我可以使用JavaScript正确查看日期

console.log(new Date(1447734116009));
> 2015-11-17T04:21:56.009Z

我如何做到这样的事情:

SELECT
*
FROM mytable
WHERE myfield->'createDate' BETWEEN '2015-11-1' AND '2015-11-10'

我还想在提取的日期字段中使用大于和小于运算符。

SELECT
*
FROM mytable
WHERE myfield->'createDate' > '2015-11-1'

我不确定如何使用PostgreSQL查询语言中的JSON扩展来构建它。

基于this help doc,,Postgres似乎没有JSON的日期运算符。如果它没有,有没有其他方式(比如使用自定义函数)将序列化日期转换为其他格式(也许是ISO格式?)然后使用常规的PostgreSQL日期运算符?

1 个答案:

答案 0 :(得分:0)

您的createDate键显然拥有Unix纪元格式的值:自1970-01-01 00:00:00 + 00以来的秒数。 PostgreSQL和Java都使用相同的格式(尽管Java在int64上使用毫秒精度,而PostgreSQL在float64中使用秒),因此您可以轻松地将json值转换为PostgreSQL {{ 1}}然后在其上应用默认的日期\时间运算符:

timestamp with time zone

更一般地说,PostgreSQL没有专门针对SELECT * FROM mytable WHERE to_timestamp(myfield->'createDate' * 0.001) BETWEEN '2015-11-1' AND '2015-11-10'; 值的任何运算符。您总是需要解压缩json文档,然后直接使用这些值,如果隐式解释没有用,可能在将它们转换为特定类型之后(例如,如果值全部为[0-9]则解释为json),就像这里的情况一样。就我所知,Java(可能还有其他语言/框架)也是如此。