【发布时间】:2014-04-10 09:52:56
【问题描述】:
我有一个查询,我想按年订购,然后按月订购。我尝试按 to_date(depdate, 'mm') 和 TO_CHAR(depdate, 'YYYY/MM') 排序。这是我正在查询的表和查询本身的 sqlfiddle sqlfiddle
【问题讨论】:
-
为什么小提琴是空的?
标签: sql oracle sql-order-by
我有一个查询,我想按年订购,然后按月订购。我尝试按 to_date(depdate, 'mm') 和 TO_CHAR(depdate, 'YYYY/MM') 排序。这是我正在查询的表和查询本身的 sqlfiddle sqlfiddle
【问题讨论】:
标签: sql oracle sql-order-by
您希望按date 值排序,而不是按字符串表示。这意味着您还想要group by date 值。 trunc(<<date column>>, 'mm') 将 date 截断到每月第一天的午夜。所以像这样的
SELECT to_char(trunc(DEPDATE,'MM'), 'Mon-YYYY') AS MONTH,
SUM(AMOUNTROOM) AS ROOMTOTAL,
SUM(AMOUNTEXTRAS) AS EXTRATOTAL,
SUM(AMOUNTEXTRAS + AMOUNTROOM) AS OATOTAL
FROM checkins
WHERE checkinstatus = 'D' AND depdate > TO_DATE('2013-12-01', 'yyyy/mm/dd')
AND depdate <= TO_DATE('2014-04-10', 'yyyy/mm/dd')
GROUP BY trunc(depdate,'mm')
ORDER BY trunc(depdate,'mm');
应该是你要找的。见the updated fiddle
【讨论】:
查看此查询。如果它是一个日期字段,只需简单的 order by 就可以了。您无需使用 TO_CHAR 转换为字符串然后排序:
WITH TAB AS
(
SELECT SYSDATE DATEVAL FROM DUAL
UNION
SELECT SYSDATE + 100 DATEVAL FROM DUAL
UNION
SELECT SYSDATE -500 DATEVAL FROM DUAL
UNION
SELECT SYSDATE + 30 DATEVAL FROM DUAL
UNION
SELECT SYSDATE -30 DATEVAL FROM DUAL
) SELECT * FROM TAB
ORDER BY DATEVAL DESC
【讨论】: