我有一个名为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日期运算符?
答案 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(可能还有其他语言/框架)也是如此。