2016-01-13 19 views
1

我有一個名爲myfield一個JSON列,它保存一個JSON文件:如何在使用PostgreSQL的JSON日期中使用比較運算符(如BETWEEN子句)?

{"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

您的createDate鍵顯然擁有Unix時代格式的值:自1970-01-01 00:00:00:00開始的秒數。 PostgreSQL和Java都使用相同的格式(雖然Java在int64上使用毫秒精度,而PostgreSQL在float64中使用秒數),因此您可以輕鬆地將json值轉換爲PostgreSQL timestamp with time zone,然後在其上應用默認日期\時間運算符:

SELECT * 
FROM mytable 
WHERE to_timestamp(myfield->'createDate' * 0.001) BETWEEN '2015-11-1' AND '2015-11-10'; 

更一般地,PostgreSQL沒有任何運營專門爲json值。你總是必須解壓你的json文檔,然後直接使用這些值,如果隱式解釋沒有用(例如,如果值全部[0-9]然後解釋爲integer),可能在將它們轉換爲特定類型之後,在這裏就是這種情況。就我所知,Java(也可能是其他語言/框架)也是如此。

相關問題