Postgresql日期格式

时间:2011-03-29 01:46:33

标签: django postgresql date

我有一个Web应用程序(使用python / django编写)(由于规格不当)Web窗体期望“YYYY-mm-dd”日期格式和其他使用“dd / mm / yy”日期格式。

有没有办法告诉postgresql接受两种格式的日期?例如,尝试“dd / mm / yy”,如果失败,则尝试“yyyy-mm-dd”。

那太棒了。

2 个答案:

答案 0 :(得分:4)

来自fine manual

  

几乎任何合理的格式都接受日期和时间输入,包括ISO 8601,SQL兼容,传统POSTGRES等。对于某些格式,日期输入中的日,月和年的排序是不明确的,并且支持指定这些字段的预期排序。将DateStyle参数设置为MDY以选择月 - 日 - 年解释,将DMY设置为选择日 - 月 - 年解释,或选择YMD以选择年 - 月 - 日解释。

     

PostgreSQL在处理日期/时间输入方面比SQL标准要求更灵活。有关日期/时间输入和已识别文本字段(包括月份,星期几和时区)的确切解析规则,请参阅附录B.

所以PostgreSQL应该能够处理你抛出的任何日期格式。然而,你的“dd / mm / yy”格式是模棱两可的。但是,有DateStyle配置参数可以帮助解决这种歧义。

例如:

=> create table x (d date not null);
=> insert into x values ('2001-01-10');
=> insert into x values ('Feb 2 2980');
=> insert into x values ('01/02/03');
=> select * from x;
     d      
------------
 2001-01-10
 2980-02-02
 2003-02-01

那就是说,我建议在内部将所有内容都移到ISO 8601(YYYY-MM-DD)并处理应用程序边缘的转换。 OTOH,有现实可以应对,所以你应该做任何你必须做的事情来实现它。

答案 1 :(得分:2)

如果这些是唯一可能的两种格式,那么最好只明确地允许那些格式,而不是依靠postgres来解释。例如:

with w as (select '2011-12-13' as input_date union select '13/12/2011')
select case when input_date~'^\d\d\d\d-\d\d-\d\d$' 
                 then to_date(input_date, 'yyyy-mm-dd')
            when input_date~'^\d\d/\d\d/\d\d\d\d$' 
                 then to_date(input_date, 'dd/mm/yyyy')
            end 
from w;

    case
------------
 2011-12-13
 2011-12-13
(2 rows)