日期转换不支持 postgresql 15 中的区域设置

Casting of dates does not honor locale settings in postgresql 15

提问人:ketil 提问时间:9/27/2023 更新时间:9/27/2023 访问量:26

问:

我正在尝试了解 postgresql 15 和语言环境设置的所有点点滴滴。我正在尝试设置控制区域设置的所有各种设置,但我仍然得到一些意外的结果。

postgres=# CREATE DATABASE lctest TEMPLATE='template0' LC_COLLATE='nb_NO.UTF-8' LOCALE='nb_NO.UTF-8';
CREATE DATABASE
postgres=# \c lctest
You are now connected to database "lctest" as user "postgres".
lctest=# show LC_TIME;
   lc_time    
-------------
 nb_NO.UTF-8
(1 row)

lctest=# select DATE('07/08/2009');
    date
------------
 2009-07-08
(1 row)

lctest=# select to_char(DATE('07/08/2009'), 'DD/TMMonth/YYYY');
    to_char
--------------
 08/Juli/2009
(1 row)

这就是我认为结果出乎意料的地方。我从字符串中转换一个日期,postgres 将日期解释为 .鉴于我的区域设置,这与预期结果不一致。我还将所有其他可用值设置为 ,并且正如预期的那样,我得到了相同的结果,因为我认为其他值不会影响这一点。MM/DD/YYYYLC_*nb_NO.UTF-8

是否还有更多设置可以影响 postgres 15 中日期字符串的解析方式?

我当然可以将日期格式指定为 ,但这会破坏语言环境设置的灵活性。如果我必须指定所有格式详细信息,那么语言环境的意义何在,对吧?DD/MM/YYYY

日期 时间 区域设置 postgresql-15

评论

1赞 ketil 9/27/2023
我现在发现还有另一个叫做 的设置,它专门设置这些日期是否应该被解释为 或 。但是我还没有弄清楚如何使此设置依赖于任何区域设置。postgresql.org/docs/15/runtime-config-client.html#GUC-DATESTYLEDateStyleDMYMDY
2赞 Nnaemeka Daniel John 9/27/2023
您可以根据区域设置首选项将会话中的 DateStyle 设置为“ISO、DMY”或“ISO、MDY”。SET DateStyle = 'ISO, DMY';

答:

0赞 Laurenz Albe 9/27/2023 #1

lc_time不影响字符串被解释为日期的方式。它用于(将时间戳格式化为字符串)和特殊的格式指令,如 .to_char()TMMonth

要影响字符串被解释为日期的方式,您必须配置 。例如:datestyle

SET datestyle = 'GERMAN, DMY';

select DATE('07/08/2009');

    date    
════════════
 07.08.2009
(1 row)