問題是使用to_char將按日期順序變成ascii順序。例如:在Postgresql中如何在保留自定義日期格式的同時按日期排序
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現在是文本類型。有一種方法可以正確地做到這一點?或僅在代碼中?
問題是使用to_char將按日期順序變成ascii順序。例如:在Postgresql中如何在保留自定義日期格式的同時按日期排序
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現在是文本類型。有一種方法可以正確地做到這一點?或僅在代碼中?
您可以使用格式化的列不同的別名:
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
的替代方法不拉富兩次會:
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
;
這只是不必要的併發症,沒有任何好處。 – kgrittn
有什麼不對
SELECT foo AS foo_date, to_char(foo,'dd/MM/yyyy') AS foo, bar
FROM baz
ORDER BY foo_date;
正確的和簡單的解決方案是:
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
只是爲了方便。
謝謝,即使有一種方法可以保留原始列名稱。 –