【问题标题】:MySQL order by dayname (custom formatted)MySQL 按日期名称排序(自定义格式)
【发布时间】:2015-11-01 07:54:22
【问题描述】:

我在 MySQL 数据库上使用的 SQL 是

SELECT
        CONCAT(YEAR(EVE_DATE),'-',MONTH(EVE_DATE),'-',DAYNAME(EVE_DATE))  AS WEEKDAY_DATE,
        SUM(EVE_OCCUR)
FROM
        TABLE
    WHERE
       EVE_DATE BETWEEN '2015-01-01' AND '2015-10-31'
    GROUP BY
            WEEKDAY_DATE 
    ORDER BY WEEKDAY_DATE

它生成的星期名的输出格式为“YYYY-MON-DAY”。目前,输出未排序。我想按以下顺序订购它

2015-01-Sun
2015-01-Mon
2015-01-Tue
2015-01-Wed
2015-01-Thu
2015-01-Fri
2015-01-Sat
2025-02-Sun
2015-02-Mon
2015-02-Tue
2015-02-Wed
2015-02-Thu
2015-02-Fri
2015-02-Sat
and so on

有人可以帮帮我吗?

【问题讨论】:

  • 感谢您尝试@lad2025。它按顺序排列月份,但不是 Sun、Mon 等。比原来的有一些改进。谢谢

标签: mysql sql


【解决方案1】:

您可以通过EVE_DATE订购:

SELECT
  CONCAT(YEAR(EVE_DATE),'-',MONTH(EVE_DATE),'-',DAYNAME(EVE_DATE))  AS WEEKDAY_DATE,
  SUM(EVE_OCCUR)
FROM TABLE
WHERE EVE_DATE BETWEEN '2015-01-01' AND '2015-10-31'
GROUP BY WEEKDAY_DATE 
ORDER BY EVE_DATE

SqlFiddleDemo

编辑:

例如我想在评论中传达的内容:

2015-01-01  - Thursday     -- 4th
2015-01-02  - Friday       -- 5th
2015-01-03  - Saturday     -- 6th
2015-01-04  - Sunday       -- 7th
2015-01-05  - Monay        -- should it be the first
2015-01-06  - Tuesday      -- 2nd
2015-01-07  - Wednesday    -- 3rd
2015-01-08  - Thurday      
2015-01-09  - Friday
2015-01-10  - Saturday
2015-01-11  - Sunday
2015-01-12  - Monday       -- 8th

当您按日期排序时,您按实际日期排序,而不是按其文本表示

现在您想从 Monady 开始,但该年/月中不存在星期一作为起点。你想洗牌 Monady 吗?你的提议对我来说是无稽之谈。

【讨论】:

  • @usert4jju7 查看演示。我不明白你的:"It gets the months in order but not Sun,Mon " 它们按升序排列
  • 这绝对比我之前得到的输出要好。我现在缺少的是 Sun,Mon,Tue...Sat 的顺序。请问如何按这个顺序排序?
  • @usert4jju7 我仍然不明白你的意思,显示你的实际数据。看到我按日期排序并仅使用 WEEK_DATE 作为演示文稿。排序是基于日期而不是字符串
  • 我现在得到的输出是 2015-01-Tue,2015-01-Thu,2015-01-Fri,2015-01-Sat,2015-01-Sun,2015-01-Mon。然后同样适用于 02,03 等月。这很棒。输出按年排序,然后按月排序。我非常感谢您在这里的帮助。我缺少的最后一点是另外订购 2015-01-Mon, 2015-01-Tue, 2015-01-Wed, 2015-01-Thu, 2015-01-Fri, 2015-01-Sat, 2015 -01-太阳。请问你能帮我解决这最后一点吗?
  • 就像这里一样 - stackoverflow.com/questions/1126961/… - ORDER BY (case DAYOFWEEK(dateField) WHEN 1 THEN 8 else DAYOFWEEK(dateField) END)。我们可以应用这样的东西来实现我所追求的吗?
【解决方案2】:

当 MySQL 有 date_format() 时,你为什么要使用 concat() 语句?

SELECT DATE_FORMAT(eve_date, '%Y-%m-%a') as weekday_date,
       SUM(EVE_OCCUR)
FROM TABLE
WHERE eve_date >= '2015-01-01' AND eve_date < '2015-02-01'
GROUP BY WEEKDAY_DATE 
ORDER BY MIN(eve_date);

对于ORDER BY,我建议使用聚合函数,而不是ORDER BY eve_date。这与标准 SQL 的工作方式是一致的。

我还将日期比较更改为使用&gt;=&lt;BETWEEN 是一个危险的日期习惯,因为当有时间组件时,它的工作方式不同。上述方法同样适用于日期和日期/时间。

【讨论】:

    【解决方案3】:

    您可以使用 EVE_DATE 列对查询中的输出进行排序

    SELECT
            CONCAT(YEAR(EVE_DATE),'-',MONTH(EVE_DATE),'-',DAYNAME(EVE_DATE))  AS WEEKDAY_DATE,
            SUM(EVE_OCCUR)
    FROM
            TABLE
        WHERE
           EVE_DATE BETWEEN '2015-01-01' AND '2015-10-31'
        GROUP BY
                WEEKDAY_DATE 
        ORDER BY YEAR(EVE_DATE),MONTH(EVE_DATE) ,FIELD(DAYNAME(EVE_DATE), 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY');
    

    【讨论】:

    • 谢谢尚卡尔。输出按年和月排序。我仍然想念Sun,Mon,Tue .. Sat。当前输出按字母顺序排列工作日名称
    • @usert4jju7 你能给我更多细节吗,我们按日期排序,理想情况下它应该产生你需要的输出,(2015-01-02 (Sun) 2015-01-03 (-Mon) ), 输出将是 2015-01-Sun, 2015-01-Mon
    • 我现在得到的输出是 2015-01-Tue,2015-01-Thu,2015-01-Fri,2015-01-Sat,2015-01-Sun,2015-01-Mon。然后同样适用于 02,03 等月。这很棒。输出按年排序,然后按月排序。我缺少的最后一点是另外订购 2015-01-Mon, 2015-01-Tue, 2015-01-Wed, 2015-01-Thu, 2015-01-Fri, 2015-01-Sat, 2015 -01-太阳。你能帮我解决最后一点吗?就像在这里 - stackoverflow.com/questions/1126961/… - ORDER BY (case DAYOFWEEK(dateField) WHEN 1 THEN 8 else DAYOFWEEK(dateField) END)
    • 我知道了,你是对的,会尽快更新解决方案
    • 完美。我衷心感谢您@Shankar 的努力。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 2017-12-13
    • 2023-03-13
    • 1970-01-01
    • 2014-08-16
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多