【问题标题】:Postgresql date formatPostgresql 日期格式
【发布时间】:2011-03-29 01:46:32
【问题描述】:

我有一个 Web 应用程序(用 python/django 编写)(由于规范错误)期望“YYYY-mm-dd”日期格式和其他使用“dd/mm/yy”日期格式的 Web 表单。

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

那太棒了。

【问题讨论】:

  • 谁说还没有?尝试在命令行中输入一些日期。除非您的服务器设置为欧洲风格的日期,否则对我有用。

标签: django postgresql date


【解决方案1】:

来自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,有现实需要抗衡,所以你应该做任何你必须做的事情来实现它。

【讨论】:

    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2017-10-01
      相关资源
      最近更新 更多