3

Date.UTCを使用して、postgresql 9.2の「json」フィールドに日付と日時を保存したかったのですが、もちろん失敗します。

hp=> update formapp_record set data='{"dt": Date.UTC(120, 10, 2)}' where id=17;
ERROR:  invalid input syntax for type json
LINE 1: update formapp_record set data='{"dt": Date.UTC(120, 10, 2)}...
                                       ^
DETAIL:  Token "Date" is invalid.
CONTEXT:  JSON data, line 1: {"dt": Date...

UTCタイムスタンプを直接保存することは可能ですが、デコーダーは、値がintではなく日付または日時にデコードする必要があることをどのようにして知ることができますか?

Date.UTC呼び出しを文字列として保存することもできます。

update formapp_record set data='{"dt": "Date.UTC(120, 10, 2)"}' where id=17;

それは機能しますが、0が必要です。文字列がDate.UTCで始まるかどうかを確認し、1。plv8でevalを使用します。

解決策は、次のようなメタデータを保存することです。

update formapp_record set data='{"dt": {"_type": "date", "_value": [120, 10, 2]}}' where id=17;

しかし、それはあまり「標準的」ではなく、「ハック的」ですらあります。

この問題についてどう思いますか?

4

2 に答える 2

5

残念ながら、jsonは日付について何も知りません

ISO8601の日付を文字列として保存します。はい、それは苦痛です。はい、それは「これは日付です」と「これは文字列です」を区別するための優れた標準的な方法がないことを意味します。ただし、IMOは、他のほとんどのオプションよりも苦痛が少ないです。

于 2012-12-10T12:54:31.117 に答える
1

可能な解決策は、Postgres のrow_to_json関数を使用し、日付をタイムスタンプとして保存し、必要に応じて json に抽出することです。ただし、Tobe Hede が Postgres 用にいくつかのjson 関数を 作成しました。これは、Postgres が 9.2 で使用できるようにした 2 つのネイティブ オプションよりも、役立つ可能性があり、より完全なように思われます。

新しい PostgreSQL JSON データ型内のフィールドを使用してクエリを実行するにはどうすればよいですか? の投稿を参照してください。スレッドのために。

于 2012-12-10T13:57:33.057 に答える