2016-06-28 120 views
0

我有一個模型,其中數據以json格式存儲在postgres的jsonb列中。在jsonb中按日期排序postgres

我想使用activerecord查詢對數據字段的輸出進行排序。

Model.all.order("json_data -> 'date'") 

給我一個輸出,但是根據日期字符串按字母順序排序。

有沒有簡單的方法我可以把它作爲約會?

注:日期是按以下格式:

"Fri, 24 Jun 2016 04:13:26 -0700" 

回答

2

如果日期格式合理,Postgres會自動處理。

Model.all.order("(json_data ->> 'date')::timestamp with time zone DESC") 

Model.all.order("(json_data ->> 'date')::timestamptz DESC") 

如果你的日期字段字符串是有點非正統的,你可以做以下

Model.all.order("to_timestamp(json_data->>'date','Dy, DD Mon YYYY HH24:MI:SS ') DESC") 

詳細here

注 - >>那裏輸出字符串而不是json對象。

你當然可以根據下面的@ Uzbekjon的回答創建一個額外的列並存儲你的信息。

1

有一個簡單的辦法可以解決這一個日期嗎?

不作爲jsonb字段的一部分,因爲JSON doesn't know anything about dates


因此,一個簡單的替代方法是將它們作爲單獨的表格列存儲。

如果你真的必須將它們存儲爲您的JSON域中的元素,那麼我會建議的兩個選項之一:

  1. Store中的字段作爲時間戳。因爲,postgresql中的json字段支持數值,並且可能(可能)優化排序。
  2. 將您的日期存儲在ISO 8601格式字符串中。 It would sort correctly,即使它是一個字符串。
+0

問題是,我從其他地方吸收數據(這是一個電子郵件存儲爲JSON),所以我真的不希望有重複分析的字段,如果有辦法保持一切清潔,我可以做所有的解析數據庫端)。 – Carpela

+0

當你這樣做時,你可以爲json字段建立索引並將其轉換爲時間戳,只要你在命令時轉換字段,它就會正確排序。 – Phill