【问题标题】:How to sort by Date from MYSQL using PHP如何使用 PHP 从 MYSQL 中按日期排序
【发布时间】:2011-04-01 08:49:53
【问题描述】:

我有一个 php 页面,它允许用户按多个因素对信息进行排序。一项新要求是按“过去 15 天内已注册的所有项目”进行排序。我将日期存储在 MYSQL 表中为mm/dd/yyyy

使用 $_GET 变量在同一页面上传递和获取信息,但由于某种原因我无法让代码工作。我查看了许多网站,但找不到有效的解决方案。

最终,脚本将按如下方式运行:

选择所有 KDATE 在今天的 15 天内的人(例如,如果今天是 2010 年 8 月 19 日,则从 2010 年 8 月 4 日起注册的所有人都会出现)。

到目前为止,我的脚本(不起作用)是:

if (isset($_GET['date'])) {
     $query = "SELECT * 
                 FROM persons 
                WHERE DATE_SUB(CURDATE(),INTERVAL 15 DAY) <= KDATE 
             ORDER BY KDATE ASC";
}

更新 1:

KDATE IS TEXT - 抱歉,KDATE 存储为 TEXT

更新 2:

Colin 提供的答案解决了我的问题。我会考虑尝试将数据转换为日期时间格式,但希望该小组能够提供这样做的实际好处。

再次感谢大家

【问题讨论】:

  • 您的意思是 KDATE 字段是 VARCHAR?
  • 使用 MySQL Date(或 DateTime)类型存储您的日期,您不会遇到这些问题 ;-)...
  • @ircmaxell:这如此 疯狂,它可能只是工作=)
  • @JM4:矫枉过正和单纯的浪费/低效是有区别的。这就像将核导弹带入刀战。当然,它更强大,但它也更难移动(因此会减慢你的速度)......而且它完全浪费了手头的资源......
  • 哦,@OMG:TEXT 数据类型最多支持 65,536 个字符(我说最多,因为它取决于存储的字符)。而且这不仅是矫枉过正,而且效率低下,因为数据甚至没有与行一起存储(因此对其进行选择会导致驱动器因搜索而受到冲击,因为它不能只使用行缓冲区)。如果您知道需要超过 255 个字符,请仅使用 TEXT。否则使用CHARVARCHAR (将它们的数据存储在行本身)...

标签: php mysql datetime date


【解决方案1】:

首先,如果您想要一个仅包含日期的列,那么使用 VARCHAR 而不是 DATE 是一个非常糟糕的主意。

如果您想将字符串用作日期,则需要使用STR_TO_DATE() 对其进行转换,并且您可能不想使用those instructions 来正确格式化您的日期。

应该这样做:

SELECT * 
FROM persons 
WHERE DATE_SUB(CURDATE(),INTERVAL 15 DAY) <= STR_TO_DATE(KDATE, "%c/%d/%Y")
ORDER BY STR_TO_DATE(KDATE, "%c/%d/%Y") ASC

【讨论】:

  • 这只是对数据进行排序,相对于我的主查询,它不会返回任何结果
  • 请注意,此样式查询将无法使用索引。这意味着它需要对每个查询进行全表扫描。如果你有很多行,或者很多这样的查询,它会让你的服务器很快非常崩溃......这将解决你的问题,但更好的解决方案是更改@987654324 @ 到 DATE 列数据类型...
【解决方案2】:

因为kdate是VARCHAR,所以需要使用STR_TO_DATE to change it to a DATETIME

在运行此之前,您需要修复不符合该模式 (mm/dd/yyyy) 的 kdate 数据:

  SELECT * 
    FROM persons 
   WHERE DATE_SUB(CURDATE(),INTERVAL 15 DAY) <= STR_TO_DATE(KDATE, 'm/%d/%Y')
ORDER BY STR_TO_DATE(KDATE, 'm/%d/%Y') ASC
  • 这意味着kdate 上的索引是无用的,因为必须更改数据类型。

一旦是 DATETIME,您就可以使用DATE_FORMAT to change the format as you like

【讨论】:

  • 所以如果我理解正确 - 你是说只要我的日期是 VARCHAR 格式,我的总体目的是不可能的?
  • @JM4:并非不可能。尝试查询,但很有可能会出现错误,因为至少有一个 kdate 值与日期格式不匹配。因此,您需要在查询起作用之前修复这些问题。
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多