【问题标题】:MYSQL order by date with DATE_FORMATMYSQL 按日期排序,使用 DATE_FORMAT
【发布时间】:2014-03-09 21:55:15
【问题描述】:

我有一个 DATE 类型的列 (startdate)。

我正在使用 DATE_FORMAT 从查询中获取“Month XX, XXXX”的结果。

但是当我 ORDER BY 日期按字母顺序排序时...如何按时间顺序排列日期?

当我在 ORDER BY 中调用 startdate 列时,我可以对其进行不同的格式设置,以便按时间顺序排序吗?

这是查询...

SELECT location, course, DATE_FORMAT( startdate, '%M %D, %Y' ) AS startdate 
    FROM `courses` c 
    LEFT JOIN `locdate` l ON c.id = l.id 
    ORDER BY startdate ASC 
    LIMIT 0, 10

【问题讨论】:

  • 正如@Marc 回答的那样,ORDER BY l.startdate ASC 很好,但将DATE_FORMAT(l.startdate, '%M %D, %Y' ) AS startdate 更改为DATE_FORMAT(l.startdate, '%M %D, %Y' ) AS startdate_MDY 并且在脚本中使用startdate 的地方,请改用startdate_MDY

标签: mysql sql


【解决方案1】:

不要按格式化的字符串版本排序。它不是允许这种排序的格式,因为它不是最重要的组件优先排序。按实际日期字段排序,自然会按正确的顺序排序。

如果您的日期是yyyy mm dd 格式,那么它自然会作为字符串排序。

SELECT ...   DATE_FORMAT(...) AS formatted    ... ORDER BY `startdate` ASC
                                 ^^^^^^^^--different alias   ^^^^^^---actual field

【讨论】:

    【解决方案2】:

    您可以使用别名来做到这一点。我必须猜测这些列的来源,但这里是一个尝试:

    SELECT l.location, c.course, DATE_FORMAT(l.startdate, '%M %D, %Y' ) AS startdate 
    FROM `courses` c 
    LEFT JOIN `locdate` l ON c.id = l.id 
    ORDER BY l.startdate ASC 
    LIMIT 0, 10;
    

    通过使用表别名,它知道使用表列中的版本。

    【讨论】:

      【解决方案3】:

      我刚刚遇到这个问题,但这是我的解决方案。 使用正常格式的日期,然后添加一个额外的列

      $query = "SELECT `StartDate` as datesort,DATE_FORMAT(`StartDate`,'%d %M %Y') as Date, FROM `courses`";
      

      我正在使用 StartDate 并将其别名为 datesort。然后我使用 datesort 进行排序。这样我可以保持 StartDate 的格式,并使用 datesort 进行排序。

      这是一个烦人的问题,但我的方法对其进行了排序(忽略双关语)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        相关资源
        最近更新 更多