【问题标题】:In Postgresql how to order by date while keeping custom date format在 Postgresql 中如何在保持自定义日期格式的同时按日期排序
【发布时间】:2012-06-29 06:35:08
【问题描述】:

问题是使用 to_char 会将按日期排序变成按 ascii 排序。示例:

SELECT foo, bar FROM baz ORDER BY foo;

我想使用 to_char 格式化 foo,但是这样做会影响顺序:

SELECT to_char(foo,'dd/MM/yyyy') as foo, bar FROM baz ORDER BY foo;

因为 foo 现在是文本类型。有没有办法正确地做到这一点?还是只在代码中?

【问题讨论】:

    标签: postgresql date formatting sql-order-by


    【解决方案1】:

    正确而简单的解决方案是:

    SELECT to_char(b.foo,'dd/MM/yyyy') as foo, b.bar
    FROM   baz b
    ORDER  BY b.foo;
    

    格式化日期列foo 是查询计划器的全新列,恰好与表列foo 冲突。在 ORDER BY 和 GROUP BY 子句中,输出列的名称优先于表列。非限定名称 foo 将引用输出列。

    要在 ORDER BY 子句中使用原始表列,只需对列进行表限定

    我对所有表格列进行了表格限定以阐明我的观点。在这种情况下,仅在 ORDER BY 子句中需要。表别名b 只是为了方便。

    【讨论】:

      【解决方案2】:

      有什么问题

      SELECT foo AS foo_date, to_char(foo,'dd/MM/yyyy') AS foo, bar 
      FROM baz 
      ORDER BY foo_date;
      

      【讨论】:

        【解决方案3】:

        不拉 foo 两次的替代方法是:

        SELECT
          to_char(foo,'dd/MM/yyyy') AS foo -- Alias precedes original column name
          ,bar
        FROM
          baz
        ORDER BY
          CAST(foo AS DATE) -- Explicit cast ensures date order instead of text
        ;
        

        它的原生 PostgreSQL 版本是:

        SELECT
          to_char(foo,'dd/MM/yyyy') AS foo -- Alias precedes original column name
          ,bar
        FROM
          baz
        ORDER BY
          foo::DATE -- Explicit cast ensures date order instead of text
        ;
        

        【讨论】:

        • 这只是不必要的并发症,没有任何好处。
        【解决方案4】:

        您可以为格式化的列使用不同的别名:

        SELECT to_char(foo,'dd/MM/yyyy') as formatted_foo, 
               bar 
        FROM baz 
        ORDER BY foo;
        

        如果您需要保留 foo 别名,作为替代方案:

        select foo,
               bar
        from (
          SELECT to_char(foo,'dd/MM/yyyy') as foo,
                 foo as foo_date 
                 bar 
          FROM baz 
        ) t
        order by foo_date
        

        【讨论】:

        • 谢谢,即使有办法保留原始列名。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多