Cách đặt cơ sở dữ liệu Postgresql để xem ngày là MD MDY vĩnh viễn


22

Làm cách nào tôi có thể đặt cơ sở dữ liệu của mình để xem 'ngày' là "MDY" mà không cần chạy:

SET datestyle = "ISO, MDY";

mọi lúc tôi đang cố gắng truy cập nó? Tôi đang sử dụng Postgresql phiên bản 9.1, Ubuntu 12.04. Vị trí hệ thống của tôi, tại thời điểm cài đặt cơ sở dữ liệu được đặt thành en_CA.utf8và gần đây tôi đã thay đổi nó thành en_US.utf8.

show lc_CTYPE

trả về: -> "en_CA.UTF-8"

nhưng

show LC_CoLLATE

trả về: -> "en_CA.UTF-8"

Câu trả lời:


32

Tôi đã từng có một vấn đề rất giống nhau nhiều năm trước, và sau đó phát hiện ra rằng tôi có thể làm được

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

Hãy thử điều đó. (Điều này hoạt động trên cơ sở cơ sở dữ liệu, cho một giải pháp cho tất cả các cơ sở dữ liệu của bạn, đặt tham số này trong bạn postgresql.conf- cảm ơn @a_horse_with_no_name.)

Xin lưu ý rằng cài đặt mặc định không độc lập . Tuy nhiên, sau khi initdbđặt nó thành bất cứ thứ gì nó muốn, bạn có thể tự thay đổi nó trong postgresql.conf.

Nhận xét của @ swasheck khiến tôi lưu ý rằng với cài đặt của mình:

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


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

cài đặt datestylecó tác dụng sau:

SET datestyle TO "ISO, MDY";

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

Bây giờ điều này không thực sự được mong đợi - và nó cũng tương tự trên một máy chủ khác en_US.UTF8. Cố gắng "ISO, DMY", cũng gợi ý cho tôi rằng "ISO"phần này ít nhiều sẽ ghi đè lên phần khác khi sản xuất một đầu ra . Đối với các giá trị đầu vào , nó có hiệu ứng mong đợi, như được tóm tắt trong bảng dưới đây:

                          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

- có nghĩa là ở trên rằng kiểu đầu vào đã cho dẫn đến lỗi cho datestylecài đặt đã cho .

Khi đọc kỹ tài liệu, người ta có thể thấy đó datestylelà một cặp cài đặt xung đột một phần:

Vì lý do lịch sử, biến này chứa hai thành phần độc lập: đặc tả định dạng đầu ra (ISO, Postgres, SQL hoặc tiếng Đức) và đặc tả đầu vào / đầu ra cho thứ tự năm / tháng / ngày (DMY, MDY hoặc YMD).

Đối với tôi, điều đó có nghĩa là người ta phải tìm ra thứ phù hợp với nhu cầu của họ bằng một chút thử nghiệm - nhưng cách tốt nhất là để mặc định và luôn sử dụng định dạng đầu vào rõ ràng. Hai trong số này là 'YYYY-MM-DD''YYYYMMDD'. Tôi thích cái trước - thậm chí sử dụng IRL này;)

Lưu ý: datestylecài đặt (và các cài đặt thời gian chạy khác) từ postgresql.confcó thể được ghi đè bằng một ALTER DATABASE bla SET datestyle ..., thiết lập nó vĩnh viễn cho một cơ sở dữ liệu hoặc bằng cách SET datestyle TO ...đặt nó cho phiên hiện tại. Điều này sau có thể hữu ích khi nhập một số dữ liệu của bên thứ ba với định dạng ngày khác.


3

Cảm ơn @a_horse_with_no_name | @dezso | @ ypercubeᵀᴹ

Tôi muốn viết câu trả lời đơn giản để thực hiện: Các bước

Cách 1 : chỉ thiết lập kiểu dữ liệu trên mỗi cơ sở dữ liệu

  1. show datestyle;hiển thị cho bạn kiểu ngày hiện tại "ISO, DMY " hoặc "ISO, MDY"

  2. Bây giờ tùy thuộc vào những gì bạn muốn trong postgres DMY hoặc MDY được đặt trong truy vấn bên dưới

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

    hoặc là

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

  3. Bước quan trọng nhất: Luôn luôn sau khi thiết lập dữ liệu khởi động lại postgres

    sudo service postgresql restart

    Hoặc là

    sudo /etc/init.d/postgresql restart

  4. Cho phép kiểm tra cấu hình

    nếu bạn đã đặt DMY bên dưới, truy vấn sẽ phù hợp với bạn

    Truy vấn: select '20/12/2016'::date Đầu ra: "2016-12-20"

    Hoặc là

    nếu bạn đã đặt MDY bên dưới, truy vấn sẽ phù hợp với bạn

    Truy vấn: select '12/19/2016'::date Đầu ra: "2016-12-19"

Cách 2 : Vĩnh viễn: mọi thứ bạn đặt trong tệp cấu hình sẽ được đặt trong tất cả các cơ sở dữ liệu bạn sẽ tạo trong tương lai

  1. Trong /etc/postgresql/9.3/main/postgresql.conf được đặt

    datestyle = 'iso, dmy' HOẶC LÀ datestyle = 'iso, mdy'

  2. Bước quan trọng nhất: Luôn luôn sau khi thiết lập dữ liệu khởi động lại postgres

    sudo service postgresql restart

    Hoặc là

    sudo /etc/init.d/postgresql restart

  3. Cho phép kiểm tra cấu hình

    nếu bạn đã đặt DMY bên dưới, truy vấn sẽ phù hợp với bạn

    Truy vấn: select '20/12/2016'::date Đầu ra: "2016-12-20"

    Hoặc là

    nếu bạn đã đặt MDY bên dưới, truy vấn sẽ phù hợp với bạn

    Truy vấn: select '12/19/2016'::date Đầu ra: "2016-12-19"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.