2016-06-28 12 views
0

私は、データがjsonb形式でポストグルのjsonb列に格納されているモデルを持っています。日付で並び替えjsonb postgres

アクティブレコード照会を使用してデータフィールドで出力をソートするとします。

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

私は日付としてこれを並べ替えることができます簡単な方法はありますか?

JSON doesn't know anything about dates以降、jsonbフィールドの一部ではありません。


したがって、別のテーブルの列として格納するのが簡単です。あなたが本当にあなたのJSONフィールドの要素としてそれらを格納する必要がある場合

、その後、私は2つのオプションのいずれかを示唆している:

  1. ストアあなたのフィールドをタイムスタンプとして。 postgresqlのjsonフィールドは数値をサポートしているので、ソートを(潜在的に)最適化できます。
  2. 日付をISO 8601書式文字列に格納します。たとえ文字列であってもIt would sort correctlyです。
+0

問題は私がどこからでもデータを吸収していることです(jsonとして保存された電子メールです)ので、すべてをきれいに保つ方法があれば、解析されたフィールドを重複させたくありません。 db側での解析)。 – Carpela

+0

jsonフィールドのインデックスを作成し、それをタイムスタンプに変換することができます。また、注文時にフィールドを変換する限り、正しくソートされます。 – Phill

関連する問題