我有一个Web应用程序(使用python / django编写)(由于规格不当)Web窗体期望“YYYY-mm-dd”日期格式和其他使用“dd / mm / yy”日期格式。
有没有办法告诉postgresql接受两种格式的日期?例如,尝试“dd / mm / yy”,如果失败,则尝试“yyyy-mm-dd”。
那太棒了。
答案 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)