【问题标题】:Why are my dates not sorting correctly?为什么我的日期没有正确排序?
【发布时间】:2010-10-30 17:41:13
【问题描述】:

不知道有没有人遇到过这个问题。
我有一个字符串转换为日期并按升序排序。日期按数字排序,但未按月份排序。我想知道是否有人遇到过这个问题,并且可以就如何正确排序日期提供一些见解。

SELECT
  u.url_id, 
  url, 
  title, 
  description, 
  pub_date, 
  DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS pub_date,
  pub_date AS sortdate 
FROM 
  urls AS u, 
  url_associations AS ua 
WHERE
  u.url_id = ua.url_id 
  AND ua.url_category_id=$type
  AND ua.approved = 'Y'
ORDER BY
  sortdate DESC

上面是代码,它可以工作,但日期没有排序,例如它排序如下:

 29-may-2009
 28-may-2009
 27-may-2009
 02-june-2009
 01-june-2009

【问题讨论】:

  • “pub_date”是表中的字符串字段吗?

标签: mysql sorting date


【解决方案1】:

好吧,我之前有点困惑。当您在列列表中选择pub_date,然后将转换设为pub_date时,您的原始查询有些混乱。但是,您随后按pub_date 列(实际上,给定sortdate as pub_date)排序 - 这似乎是一个字符串列。

您的排序应该在列之后转换为日期,但之前转换为字符串:

SELECT
  u.url_id, 
  url, 
  title, 
  description, 
  pub_date,
  STR_TO_DATE(pub_date, '%d-%b-%Y') AS sortdate,
  DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS formatted_date
FROM 
  urls AS u, 
  url_associations AS ua 
WHERE
  u.url_id = ua.url_id 
  AND ua.url_category_id=$type
  AND ua.approved = 'Y'
ORDER BY
  sortdate DESC

请注意,我已将“格式化”版本重命名为 formatted_date。不清楚是否还需要选择原来的pub_dateformatted_date 位可能是:

DATE_FORMAT(sortdate, '%d.%b.%Y') AS formatted_date

但我不完全确定。我希望查询优化器无论如何都能解决这个问题。

您的pub_date 列真的必须是字符串吗?为什么不将它作为更合适的类型保留在数据库中,以避免所有的解析?

【讨论】:

  • 谢谢,这已经奏效了,我不得不通过删除 AS Formatted_date 来稍微改变它。这是工作代码 - “SELECT u.url_id, url, title, description, pub_date, STR_TO_DATE(pub_date, '%d-%b-%Y') AS sortdate, DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b -%Y'), '%d.%b.%Y') FROM url AS u, url_associations AS ua WHERE u.url_id = ua.url_id AND ua.url_category_id=$type AND ua.approved = 'Y'ORDER BY排序日期 DESC";
  • 谢谢,日期是一个 javascript 下拉日历选择器,它将隐藏的字符串传递给数据库。我现在正在尝试将日期转换为 RSS 将验证的格式。非常感谢你的帮助。我对此很陌生,日期让我感到困惑。再次感谢 Jon 和所有发帖的人,你们都帮了大忙。
  • 那么 DATE_FORMAT 值是什么(就列名而言)?我的 SQL-fu 相当弱,但我不明白为什么它会因名称而失败...
  • 日期格式作为字符串传递,例如 29-MAY-2009。我已将此添加到来自 JS 选择器“日期”的列 pub_date 中的数据库中。我把它作为一个字符串,因为老实说,当我设置它时,我想不出一种将它作为日期传递给 MySQL 的方法。您添加的额外 STR_DATE 解决了我的日期排序错误。谢谢。
  • 这个答案给了我解决相关问题所需的想法。谢谢!
【解决方案2】:

我也遇到过类似的问题。我所做的(并且仅使用 ORACLE)是在您的 orderby 中使用 date_format 而不是已经格式化的日期。

所以按您的顺序使用:

DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y') DESC

或 - 将首先按年份排序

DATE_FORMAT(STR_TO_DATE(pub_date, '%Y-%b-%d') DESC

【讨论】:

  • 这仍然会按 string 而不是 date 排序,不是吗?
  • 不幸的是,我今天只能访问 ORACLE,所以我无法验证,但是,在我刚刚测试过的 ORACLE 中,它可以与 to_char (created_dt, 'dd/MON/yyyy') 一起正常工作,它也返回一个字符串。限制是几天,然后几个月。你总是可以用一个额外的 date_format 字符串来进一步分解它,以便进一步排序月份
  • 或者您甚至可以先按年将您的订单切换为年/月/日顺序。
  • ... 或者您可以按日期而不是字符串字段对其进行排序,不是吗? :) 无论如何,这是我的计划……
  • 乔恩,当然,我通常会按我认为最好的解决方案以及为什么我 +1 你的回复的日期订购。
【解决方案3】:

看起来“pub_date”是一个字符串字段?如果是这样,您需要将其转换为日期时间才能按预期进行排序。

【讨论】:

    【解决方案4】:

    您告诉查询对转换后的字符串进行排序,这意味着它正在对 string 而不是 date 进行排序。请尝试按 pub_date 排序。

    【讨论】:

    【解决方案5】:

    你想这样排序..

    ORDER BY DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y')
    

    但如果可以的话,我认为您应该考虑将基列从字符串更改为日期 - 有很多原因:可扩展性、性能、可维护性、数据完整性、yada yada yada。

    【讨论】:

      【解决方案6】:

      试试

      "SELECT u.url_id, url, title, description, pub_date, DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS pub_date, pub_date AS sortdate FROM urls AS u, url_associations AS ua WHERE u.url_id = ua.url_id AND ua.url_category_id=$type AND ua.approved = 'Y' ORDER BY pub_date DESC";
      

      问题是你有

       pub_date AS sort_date 
      

      在查询中,因此当您按 sort_date 排序时,您按字符串排序。 将排序顺序替换为

      ORDER BY pub_date DESC
      

      一切都应该正常。

      【讨论】:

      • 嗨 Nathaniel,我正在使用当前的语法,但它不会对日期月份进行降序排序。 //"SELECT u.url_id, url, title, description, pub_date, DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%Y.%m.%d') FROM urls AS u, url_associations AS ua WHERE u.url_id = ua.url_id AND ua.url_category_id=$type AND ua.approved = 'Y' ORDER BY pub_date DESC";// 谢谢你的帮助
      • 问题是您现在只选择了 pub_date,它是一个字符串。如果你使用这个查询,你应该 ORDER BY u DESC。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2021-12-31
      相关资源
      最近更新 更多