Bagaimana mengatur basis data Postgresql untuk melihat tanggal sebagai "MDY" secara permanen

22

Bagaimana saya bisa mengatur basis data saya untuk melihat 'tanggal' sebagai "MDY" tanpa menjalankan:

SET datestyle = "ISO, MDY";

setiap kali saya mencoba mengaksesnya? Saya menggunakan Postgresql versi 9.1, Ubuntu 12.04. Sistem saya lokal, pada saat instalasi basis data diatur ke en_CA.utf8dan saya baru saja mengubahnya en_US.utf8.

show lc_CTYPE

pengembalian: -> "en_CA.UTF-8"

tapi

show LC_CoLLATE

pengembalian: -> "en_CA.UTF-8"

Timka
sumber

Jawaban:

32

Saya dulu memiliki masalah yang sangat mirip bertahun-tahun yang lalu, dan kemudian menemukan bahwa saya bisa melakukannya

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

Coba itu. (Ini berfungsi pada basis per basis data, untuk solusi untuk semua basis data Anda, setel parameter ini di dalam diri Anda postgresql.conf- terima kasih kepada @a_horse_with_no_name.)

Perlu diketahui bahwa pengaturan default tidak independen terhadap lokal . Namun, setelah initdbmenetapkan ke apa pun yang diinginkan, Anda dapat mengubahnya sendiri di postgresql.conf.

Komentar @ swasheck membuat saya mencatat bahwa dengan pengaturan saya:

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


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

pengaturan datestylememiliki efek sebagai berikut:

SET datestyle TO "ISO, MDY";

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

Sekarang ini tidak benar-benar diharapkan - dan itu sama pada server lain en_US.UTF8juga. Mencoba "ISO, DMY", juga menunjukkan kepada saya bahwa "ISO"bagian tersebut kurang lebih mengesampingkan bagian lain ketika menghasilkan output . Untuk nilai input , ini memiliki efek yang diharapkan, seperti yang dirangkum dalam tabel di bawah ini:

                          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

- Berarti di atas bahwa gaya input yang diberikan menghasilkan kesalahan untuk datestylepengaturan yang diberikan .

Setelah membaca dokumentasi dengan saksama, orang dapat melihat bahwa itu datestyleadalah sepasang pengaturan yang bertentangan sebagian:

Untuk alasan historis, variabel ini berisi dua komponen independen: spesifikasi format output (ISO, Postgres, SQL, atau Jerman) dan spesifikasi input / output untuk pemesanan tahun / bulan / hari (DMY, MDY, atau YMD).

Bagi saya itu berarti bahwa seseorang harus menemukan yang sesuai dengan kebutuhan mereka dengan sedikit bereksperimen - tetapi cara terbaik adalah meninggalkannya di default dan selalu menggunakan format input yang jelas. Dua di antaranya adalah 'YYYY-MM-DD'dan 'YYYYMMDD'. Saya lebih suka yang pertama - bahkan menggunakan IRL ini;)

Catatan: datestylepengaturan (dan pengaturan runtime lainnya) dari postgresql.confdapat ditimpa oleh ALTER DATABASE bla SET datestyle ..., pengaturan secara permanen untuk satu basis data, atau dengan SET datestyle TO ...mengaturnya untuk sesi saat ini. Yang terakhir ini mungkin berguna ketika mengimpor beberapa data pihak ketiga dengan format tanggal yang berbeda.

dezso
sumber
3

Terima kasih @a_horse_with_no_name | @dezso | @ ypercubeᵀᴹ

Saya ingin menulis jawaban yang mudah diterapkan: Langkah

Cara 1 : mengatur datestyle Per Hanya Database

  1. show datestyle;menampilkan gaya tanggal saat ini "ISO, DMY " atau "ISO, MDY"

  2. Sekarang tergantung pada apa yang Anda inginkan dalam postgres DMY atau MDY yang diatur dalam kueri di bawah ini

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

    atau

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

  3. Langkah paling penting: Selalu setelah mengatur postest me-restart postgres

    sudo service postgresql restart

    Atau

    sudo /etc/init.d/postgresql restart

  4. Memungkinkan konfigurasi pengujian

    jika Anda telah menetapkan permintaan DMY di bawah ini akan berhasil untuk Anda

    Kueri: select '20/12/2016'::date Output: "2016-12-20"

    Atau

    jika Anda telah menetapkan MDY di bawah ini, kueri akan bekerja untuk Anda

    Kueri: select '12/19/2016'::date Output: "2016-12-19"

Cara 2 : Secara permanen: apa pun yang Anda atur di file konfigurasi akan ditetapkan di semua database yang akan Anda buat di masa depan

  1. Di /etc/postgresql/9.3/main/postgresql.conf atur

    datestyle = 'iso, dmy' ATAU datestyle = 'iso, mdy'

  2. Langkah paling penting: Selalu setelah mengatur postest me-restart postgres

    sudo service postgresql restart

    Atau

    sudo /etc/init.d/postgresql restart

  3. Memungkinkan konfigurasi pengujian

    jika Anda telah menetapkan permintaan DMY di bawah ini akan berhasil untuk Anda

    Kueri: select '20/12/2016'::date Output: "2016-12-20"

    Atau

    jika Anda telah menetapkan MDY di bawah ini, kueri akan bekerja untuk Anda

    Kueri: select '12/19/2016'::date Output: "2016-12-19"

vijay
sumber