在Postgresql中如何按照日期排序并保留自定义日期格式

3
问题在于使用 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现在是文本类型,有没有正确的方法来解决这个问题?或者只能在代码中进行更改?

4个回答

6

适当且简单的解决方案是:

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

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

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

我已经对所有列名进行了表格限定,以确保清晰明了。在这种情况下,仅在ORDER BY子句中需要。表别名b仅供方便之用。


3

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

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

谢谢,即使有一种方法可以保留原始列名。 - Humberto Pinheiro

1

这是什么问题

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

-1

不重复调用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
;

1
这只是没有任何好处的不必要的复杂化。 - kgrittn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接