Postgresql

如何設置 Postgresql 數據庫以將日期永久視為“MDY”

  • November 17, 2021

如何在不執行的情況下設置我的數據庫以將“日期”視為“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"

幾年前我曾經有一個非常相似的問題,然後發現我可以做到

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 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是一對部分衝突的設置:

由於歷史原因,此變數包含兩個獨立的組件:輸出格式規範(ISO、Postgres、SQL 或德語)和年/月/日排序的輸入/輸出規範(DMY、MDY 或 YMD)。

對我來說,這意味著必須通過一些試驗找到適合他們需求的那個——但最好的方法是將其保留為預設值並始終使用明確的輸入格式。其中兩個是'YYYY-MM-DD''YYYYMMDD'。我更喜歡前者——即使使用這個 IRL ;)

注意:datestyle設置(和其他執行時設置)postgresql.conf可以被 覆蓋,ALTER DATABASE bla SET datestyle ...為單個數據庫永久設置,或SET datestyle TO ...為目前會話設置。後者在導入一些具有不同日期格式的第三方數據時可能很有用。

引用自:https://dba.stackexchange.com/questions/19679