web-dev-qa-db-ja.com

日付を「MDY」として永久に表示するようにPostgresqlデータベースを設定する方法

実行せずに「日付」が「MDY」と表示されるようにデータベースを設定するにはどうすればよいですか。

SET datestyle = "ISO, MDY";

毎回アクセスしようとしていますか?私はPostgresqlバージョン9.1、Ubuntu 12.04を使用しています。データベースのインストール時のシステムロケールはen_CA.utf8に設定されていましたが、最近en_US.utf8に変更しました。

show lc_CTYPE

戻り値:-> "en_CA.UTF-8"

だが

show LC_CoLLATE

戻り値:-> "en_CA.UTF-8"

23
Timka

私は何年も前に非常によく似た問題を抱えていましたが、自分にできることがわかりました

ALTER DATABASE database_name SET datestyle TO "ISO, MDY";

やってみて。 (これはデータベースごとに機能します。すべてのデータベースのソリューションでは、このパラメータをpostgresql.confに設定します-@a_horse_with_no_nameのおかげです。)

デフォルト設定は ロケールに依存しない であることに注意してください。ただし、initdbが必要なものに設定した後、postgresql.confで自分で変更できます。

@swasheckのコメントは、私の設定で次のことに気づきました

test=# SHOW lc_ctype;
      lc_ctype
--------------------
 Hungarian, Hungary
(1 row)


test=# SHOW lc_time;
      lc_time
--------------------
 Hungarian, Hungary
(1 row)

datestyleを設定すると、次のような影響があります。

SET datestyle TO "ISO, MDY";

SELECT current_date;
    date
------------
 2012-06-21
(1 row)

これは実際には予期されていません-en_US.UTF8を備えた他のサーバーでも同じです。 "ISO, DMY"を試してみても、出力を生成するときに"ISO"の部分が他の部分を多少上書きしていることがわかります。 input値の場合、次の表にまとめられているように、期待される効果があります。

                          input values
           '2016/01/21'   '01/21/2016'   '21/01/2016'         output
──────────────────────────────────────────────────────────────────────
ISO, YMD        OK             --             --            2016-01-21
ISO, DMY        --             OK             --            2016-01-21
ISO, MDY        --             --             OK            2016-01-21

-上記は、指定された入力スタイルが指定されたdatestyle設定でエラーになることを意味します。

ドキュメントを注意深く読むと、datestyleが部分的に競合する設定のペアであることがわかります。

歴史的な理由により、この変数には2つの独立したコンポーネントが含まれます。出力形式の仕様(ISO、Postgres、SQL、またはドイツ語)と年/月/日の順序の入力/出力仕様(DMY、MDY、またはYMD)です。

私にとっては、少し実験して自分のニーズに合ったものを見つける必要があるということですが、最善の方法は、デフォルトのままにし、常に明確な入力形式を使用することです。これらの2つは'YYYY-MM-DD''YYYYMMDD'です。私は前者を好む-このIRLを使用する;)

注:postgresql.confdatestyle設定(およびその他のランタイム設定)は、ALTER DATABASE bla SET datestyle ...によって上書きされ、単一のデータベースに対して永続的に設定されるか、またはSET datestyle TO ...によって上書きされます。現在のセッション。後者は、日付形式が異なるサードパーティのデータをインポートする場合に役立ちます。

34
dezso

ありがとう@ a_horse_with_no_name | @dezso | @ypercubeᵀᴹ

私は答えを書いてみたい実装が簡単:手順

方法1データベースごとの日付スタイルの設定のみ

  1. show datestyle;現在の日付スタイルを表示"ISO、DMY"または"ISO、MDY"

  2. Postgresで何をしたいかに応じて[〜#〜] dmy [〜#〜]または[〜#〜] mdy [〜#〜]以下のクエリで設定

    ALTER DATABASE "my_database_name" SET datestyle TO "ISO, DMY";

    または

    ALTER DATABASE "my_database_name" SET datestyle TO "ISO, MDY";

  3. 最も重要なステップ:常にdatestyle再起動postgresを設定した後

    Sudo service postgresql restart

    または

    Sudo /etc/init.d/postgresql restart

  4. 設定をテストしましょう

    [〜#〜] dmy [〜#〜]を設定した場合、以下のクエリが機能するはずです

    クエリ:select '20/12/2016'::date出力:"2016-12-20"

    または

    [〜#〜] mdy [〜#〜]を設定した場合、以下のクエリが機能するはずです

    クエリ:select '12/19/2016'::date出力:"2016-12-19"

方法2:永久に:構成ファイルに設定したものは、今後作成するすべてのデータベースに設定されます

  1. /etc/postgresql/9.3/main/postgresql.confセット

    datestyle = 'iso, dmy' OR datestyle = 'iso, mdy'

  2. 最も重要なステップ:常にdatestyle再起動postgresを設定した後

    Sudo service postgresql restart

    または

    Sudo /etc/init.d/postgresql restart

  3. 設定をテストしましょう

    [〜#〜] dmy [〜#〜]を設定した場合、以下のクエリが機能するはずです

    クエリ:select '20/12/2016'::date出力:"2016-12-20"

    または

    [〜#〜] mdy [〜#〜]を設定した場合、以下のクエリが機能するはずです

    クエリ:select '12/19/2016'::date出力:"2016-12-19"

3
vijay