【问题标题】:Oracle order by year, monthOracle 按年、月排序
【发布时间】:2014-04-10 09:52:56
【问题描述】:

我有一个查询,我想按年订购,然后按月订购。我尝试按 to_date(depdate, 'mm') 和 TO_CHAR(depdate, 'YYYY/MM') 排序。这是我正在查询的表和查询本身的 sqlfiddle sqlfiddle

【问题讨论】:

  • 为什么小提琴是空的?

标签: sql oracle sql-order-by


【解决方案1】:

您希望按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

【讨论】:

    【解决方案2】:

    查看此查询。如果它是一个日期字段,只需简单的 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
    

    【讨论】:

    • SELECT to_char(DEPDATE,'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
    猜你喜欢
    • 2018-06-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多