如何设置 Postgresql 数据库以将日期永久显示为“MDY”

Tim*_*mka 26 postgresql date-format

如何在不运行的情况下设置我的数据库以将“日期”视为“MDY”:

SET datestyle = "ISO, MDY";
Run Code Online (Sandbox Code Playgroud)

每次我试图访问它?我使用的是 Postgresql 9.1 版,Ubuntu 12.04。我的系统区域设置,在数据库安装时设置为en_CA.utf8,我最近将其更改为en_US.utf8.

show lc_CTYPE
Run Code Online (Sandbox Code Playgroud)

返回:--> "en_CA.UTF-8"

show LC_CoLLATE
Run Code Online (Sandbox Code Playgroud)

返回:--> "en_CA.UTF-8"

dez*_*zso 36

几年前我曾经有过一个非常相似的问题,然后发现我可以做到

ALTER DATABASE database_name SET datestyle TO "ISO, MDY";
Run Code Online (Sandbox Code Playgroud)

试试那个。(这适用于每个数据库,对于所有数据库的解决方案,请在您中设置此参数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)
Run Code Online (Sandbox Code Playgroud)

设置datestyle有以下效果:

SET datestyle TO "ISO, MDY";

SELECT current_date;
    date
------------
 2012-06-21
(1 row)
Run Code Online (Sandbox Code Playgroud)

现在这不是真正的预期 - 在其他服务器上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
Run Code Online (Sandbox Code Playgroud)

-- 表示上面给定的输入样式导致给定datestyle设置的错误。

仔细阅读文档后,可以看到这datestyle是一对部分冲突的设置:

由于历史原因,此变量包含两个独立的组件:输出格式规范(ISO、Postgres、SQL 或德语)和年/月/日排序的输入/输出规范(DMY、MDY 或 YMD)。

对我来说,这意味着人们必须通过一些实验来找到适合他们需求的格式 - 但最好的方法是将其保留为默认值并始终使用明确的输入格式。其中两个是'YYYY-MM-DD''YYYYMMDD'。我更喜欢前者 - 即使使用这个 IRL ;)

注意:datestylefrom的设置(和其他运行时设置)postgresql.conf可以被 覆盖ALTER DATABASE bla SET datestyle ...,为单个数据库永久设置它,或者SET datestyle TO ...为当前会话设置它。后者在导入某些具有不同日期格式的第三方数据时可能很有用。


vij*_*jay 5

谢谢@a_horse_with_no_name| @dezso | @ypercube??

我想写一个易于实现的答案:步骤

方式 1仅设置每个数据库的日期样式

  1. show datestyle;显示当前日期样式“ISO、DMY ”或“ISO、MDY”

  2. 现在取决于您在以下查询中设置的postgres DMYMDY 中想要的内容

    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' 或者 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"