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.)
请注意,默认设置为not locale independent.但是,在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是一对部分冲突的设置:
For historical reasons,this variable contains two independent components: the output format specification (ISO,Postgres,sql,or German) and the input/output specification for year/month/day ordering (DMY,MDY,or YMD).
对我而言,这意味着必须通过一些实验找到符合他们需求的那个 – 但最好的方法是将其保留为默认值并始终使用明确的输入格式.其中两个是’YYYY-MM-DD’和’YYYYMMDD’.我更喜欢前者 – 甚至使用这个IRL;)
注意:postgresql.conf中的日期样式设置(以及其他运行时设置)可以被ALTER DATABASE bla SET datestyle …覆盖,为单个数据库永久设置,或者通过SET datestyle TO …将其设置为当前会话.当使用不同的日期格式导入某些第三方数据时,后者可能很有用.