2011-03-29 108 views
0

我有一个Web应用程序(用python/django编写),因为预期“YYYY-mm-dd”日期格式和其他使用“dd/mm/yy”日期格式的Web窗体。Postgresql日期格式

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

那真是太棒了。

+1

谁说这不是已经?尝试在命令行输入一些日期。适用于我,除非您的服务器设置为欧式风格日期。 – 2011-03-29 04:21:11

回答

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

如果这些是唯一可能的两种格式,那么最好只明确地允许那些,而不是依靠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)