2017-12-12 10 views
0

PostgreSQLデータベースに日付と時刻を保存し、適切な形式でユーザに取得して表示します。PostgreSQLデータベースに日付と時刻を保存する最良の方法

アプリケーションユーザーがイランにあり、Jalali日時システムを使用するとします。今年の上半期のイランの時間はUTC + 04:30ですが、それ以外の年はUTC + 03:30です。実際には夏時間のがイランで使用されています。重要

は時々、私たちは他のヨーロッパ諸国やイランからの決定と変更データベースサーバーの場所を作ります。

今、私はいくつかの質問を持っている:

  1. 時間で日付を保存する方が便利であるどのようなデータタイプ? TIMESTAMPTIMESTAMP WITHOUT TIMEZONE)またはTIMESTAMPZTIMESTAMP WITH TIME ZONE)?

  2. 保存する方が便利なデータタイプ時間はです。 TIMEまたはTIME WITH TIME ZONE

  3. 保存する方が便利なデータタイプ日付のみDATE(グレゴリオ)String(Jalali)またはカスタムデータ型ですか?

  4. データベースのTIMEZONEを1回設定するにはどうすればよいですか?私はデータベースのためにTIMEZONEを1回に設定したいと思います。その後、TIMESTAMPZ列のすべてのクエリが保存され、そのTIMEZONE内にフェッチされ、夏時間も考慮されますか?

  5. 現在の日付と時刻を保存するのに最適なSQLクエリは何ですか?

    a-INSERT INTOテスト(d)VALUES(now());

    b-INSERT INTOテスト(d)VALUES(now()at time zone 'utc');

    c-INSERT INTOテスト(d)VALUES(now()at time zone 'Asia/Tehran');

    d-INSERT INTOテスト(d)VALUES(current_timestamp);

    e-INSERT INTOテスト(d)VALUES(now()at time zone 'utc');

    f-INSERT INTOテスト(d)VALUES(now()at time zone 'Asia/Tehran');

  6. 番号5-cと5-fは、保存時に夏時間と見なされますか?

  7. データベースに「アジア/テヘラン」のタイムゾーンがある場合、「アジア/テヘラン」に5-aと5-dが保存されていますか?

  8. データベースからクエリを実行する場合、私の状況ではどのようなオプションが最適ですか?

    a- SELECT d FROM test;

    b- SELECT d at time zone 'utc' FROM test;

    c- SELECT d時間帯 'Asia/Tehran' FROMテスト;

  9. 番号7-cは夏時間ですか?

  10. 数字7は「アジア/テヘラン」のタイムゾーンと夏時間のデータベースが「アジア/テヘラン」のタイムゾーンの場合ですか?

私は、日付/時間を節約するためにタイムスタンプを使用して、より良いたい場合、私はそれに夏時間を追加し、ジャラリ日付時刻に変換し、ユーザー、およびその逆にそれを示さなければなりません。タイムゾーン付きタイムスタンプのために

+2

タイムゾーン付きのタイムスタンプは、常にUTCで保存されます。夏時間は関係ありません。 postgresはそれを出力時にフォーマットし、夏時間と全てをまとめます。だから、3つすべてのタイムスタンプを使い、適切なフォーマットを使って、日付、時刻のみを選択してください。 –

+0

@ VaoTsunありがとう。だからTIMESTAMPZを選んだ場合、データベースから照会するときの夏時間も考慮されますか?これはすでに保存されているデータに影響しますか?第4の質問にもお答えください。 (今私は4番目の質問を追加します) –

答えて

1

https://www.postgresql.org/docs/current/static/datatype-datetime.html

、内部に格納された値は、 UTC(伝統的にグリニッジ 時間、GMTとして知られている協定世界時)には常にあります。明示的なタイムゾーンが指定された入力値は、そのタイムゾーンの適切なオフセットを使用して をUTCに変換したものです。入力文字列に のタイムゾーンが指定されていない場合は、システムのTimeZoneパラメータで指定されたタイムゾーンで とし、タイムゾーンゾーンのオフセットを使用して をUTCに変換します。

タイムゾーン値を持つタイムスタンプが出力されると、常に がUTCから現在のタイムゾーンゾーンに変換され、そのゾーンに現地時間 として表示されます。別のタイムゾーンの時刻を参照してください、どちらか 変更のタイムゾーンやAT TIME ZONEを使用するには、唯一の

  • データベースが保存されます

    1. TIMESTAMPTZ
    2. TIMESTAMPTZと選択した日付のみ
    3. TIMESTAMPTZと選択の時間を構築しますあなたのロケールや設定に関係なく、UTCでタイムゾーンを認識します。スタンプは常にTimeZoneパラメータでUTCに変換されます。毎回データを表示するときに同じデコンベーションが発生します。サーバーのTimeZoneはデフォルト値のみで、クライアントが何も指定しない場合に使用されます。データベースTimeZoneは指定されたデータベースのpostgresql.confのデータベースよりも優先されますが、依然としてクライアントの設定はデータベースの設定を上書きします。
    +0

    ありがとうございます。クライアントの設定はどこですか?コントロールパネルまたはシステム設定では? –

    +1

    もいずれも、それはクライアントに依存します。しかし、基本的にはhttps://www.postgresql.org/docs/current/static/config-setting.html#CONFIG-SETTING-SQL-COMMAND-INTERACTIONをチェックし、もっと短く(プラスかマイナスかわからない)https ://www.postgresql.org/docs/current/static/sql-set.html –

    +0

    ありがとうございます。本当にありがとう。あなたは私の最後の質問に答えてください。今すぐ最初の投稿に今追加しますか? (質問5-10)。どうもありがとう –

    関連する問題