【问题标题】:ORDER BY two colums, but not sorting by time?ORDER BY 两列,但不按时间排序?
【发布时间】:2013-06-26 17:59:25
【问题描述】:

我之前发过这个问题,找到了解决办法:ORDER BY with two columns in MySQL

这是关于排序事件。优先级应该是 TOP-PREMIUM 和 PREMIUM 事件总是在每个日期之前,无论如何。

解决方案是一列是 ENUM 而不是 INT。这就是他排序错误的原因。

所以现在我这样排序:ORDER BY e.date ASC, e.highlight DESC

现在我又遇到了一个新问题,因为我所有的日期都设置为 00:00:00 的时间,我在这里提出问题并认为一切都已解决。如果我将时间设置为 00:00 之后的某个小时,它将位于所有事件的首位。即使在 PREMIUM 和 TOP-PREMIUM(亮点)活动中也是如此。

我能不能让 MySQL 忽略 datetime 类型列 date 的时间,或者有没有其他方法可以像我想要的那样工作?

问题还在于我不能先通过突出显示 DESC 进行排序,因为这样整个列表就不会按日期排序。

【问题讨论】:

    标签: mysql sql date datetime sql-order-by


    【解决方案1】:

    您可以使用 CAST() 函数或 DATE_FORMAT 函数仅获取日期部分,因此应该可以:

    ORDER BY CAST(e.date AS DATE), e.highlight DESC
    ORDER BY DATE_FORMAT(e.date, '%Y-%m-%d'), e.highlight DESC
    

    演示:SQL Fiddle

    编辑:更新 sql fiddle 演示以使用 2 列,您可以看到日期的时间部分不影响排序顺序。

    【讨论】:

    • 我找到了另一个解决方案:ORDER BY CAST(e.date AS date) DESC, e.highlight DESC
    • 我个人会坚持使用 CAST()。
    【解决方案2】:

    您还可以使用DATE 函数,该函数从DATETIME 中去除时间分量:

    ORDER BY DATE(e.date), e.highlight DESC
    

    【讨论】:

    • 我找到了另一个解决方案:ORDER BY CAST(e.date AS date) DESC,e.highlight DESC。哪种解决方案更高效或减少数据库工作量?
    • 我不确定那个。我的直觉是两者之间不会有太多或任何区别,但我无法对它们进行基准测试。如果这是针对索引DATETIME 列上的WHERE 子句,我不会使用任何解决方案(包括我的),但对于ORDER BY,我认为您不会看到明显的差异。
    • 你的意思是,你一般不会对 WHERE 子句进行 CAST 吗?
    • 不一定。我的意思是,如果我在列上有一个索引并希望它优化 WHERE 子句,我不会在 WHERE 子句中的列上调用 any 函数 - 我' d 找到一种方法来使用“纯”列值。所以CAST 在这种情况下会被淘汰,但DATEDATE_FORMAT 也会被淘汰。但是,如果优化/索引不在混合中,那么使用CAST 完全没有问题。
    猜你喜欢
    • 2014-03-30
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2022-01-24
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多