【问题标题】:mysql custom order by- datesmysql自定义订单截止日期
【发布时间】:2012-12-01 09:19:06
【问题描述】:

我有一张表,其中列出了一年中的所有十二个月。我想订购此列,当前月份在底部,然后按时间顺序排列,如果我现在运行查询;

十二月

一月

二月

...

九月

十一月

月份的格式为 MONTHNAME(STR_TO_DATE(U.month, '%m'))

我根据我在此处找到的内容对其进行了改编,但这仅有助于确保当前月份排在最后,有什么想法吗?

      ORDER BY (CASE 
           WHEN Month = MONTH(NOW())
           THEN 1
           ELSE 0
       END ) ASC, month ASC

【问题讨论】:

  • 这是您要在生产环境中重复使用的查询,还是用于一次性报告目的?
  • 好吧,它会在不寻常的场合使用,所以优化不是一个大问题,如果这就是你想要的?
  • 是的,这就是我问的原因。如果您对此进行定期查询,我建议的答案将包括更改字段类型。

标签: mysql sql-order-by


【解决方案1】:
ORDER BY (CASE 
          WHEN Month = MONTH(NOW())
          THEN 1
          ELSE 0
          END) DESC, month ASC

或:

ORDER BY (CASE 
          WHEN Month = MONTH(NOW())
          THEN 0
          ELSE 1
          END) ASC, month ASC

两者都可以解决问题。

【讨论】:

  • 谢谢,但除了当前月份(在顶部)和其余月份之外的其他月份都没有在上面描述。
  • 我已经更新了我的原始帖子,可能是我格式化了导致问题的日期吗?
【解决方案2】:

如果您想在您的月份中坚持使用字符串值,您可以稍作修改使其工作。您可能需要使用完整的月份名称,或者对所有月份使用 3 个字母的缩写(我不太确定您使用的是什么格式,因为您的示例显示了缩写,但您还提到了 MONTHNAME() 输出完整的月。这里是如何工作的

对于 3 个字母的月份缩写:

ORDER BY (STR_TO_DATE(CONCAT(`month`, ' 01 2012'), '%b %d %Y')) ASC

完整的月份名称:

ORDER BY (STR_TO_DATE(CONCAT(`month`, ' 01 2012'), '%M %d %Y')) ASC

这会将月份值转换为日期(通过添加日期和年份)然后排序。

【讨论】:

  • 感谢 Mike,但我收到此错误 - 函数 str_to_date 的日期时间值不正确:'1 01 2012'
  • 抱歉,我使用的是完整的月份名称。
  • 好的,如果我使用“ORDER BY STR_TO_DATE(Month, '%m') ASC;”就可以了但它是否总是将当前月份作为其 12 月放在底部?我不确定它最后订购是因为它是上个月还是因为它是当前月份?
猜你喜欢
  • 2014-10-04
  • 2011-04-05
  • 2014-11-22
  • 1970-01-01
  • 2014-08-13
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多