MYSQL根据特定格式显示比当前日期更早的记录

时间:2018-03-31 17:32:48

标签: php mysql

我使用这种格式在数据库中存储日期。 Tue 27 Mar, 2018,格式为'D d M, Y'。如何使用特定日期格式显示数据库中早于当前日期的记录?

我首先创建了这个函数,看它是否正确找到过期的记录。但是,它不起作用。

$dateToday = DateTime::createFromFormat('D d M, Y', date(' D d M, Y'));

$query = "SELECT * FROM offer WHERE date < '$dateToday' LIMIT 1";
$result = mysqli_query($link, $query);

while ($row = mysqli_fetch_assoc($result)) {

    echo $row['date'];
}

1 个答案:

答案 0 :(得分:0)

将时态信息(DATE,TIME,TIMESTAMP等)存储为纯文本被认为是一个主要的设计缺陷,因为mysql永远不会知道这些数据的性质,因此不可能使用针对这些数据类型的强大搜索和索引算法。

要比较日期的MySQL只能使用这样即使像串Sun 01 April, 2018可能看起来像一个有效的日期给你,但为MySQL,它只是一个普通的字符串像hello

$query = "SELECT * FROM offer WHERE date < 'Sun 01 Apr, 2018' LIMIT 1";

从mysql的POV中,上面的比较只是一个常规字符串比较和NOT日期比较因为它不会将它们视为日期所以'10 Apr'可能被判断为小于' 1月10日'导致10个取消,'A'出现在'J'之前。您需要的是将这些字符串转换为实际日期实例

但如果你仔细一点,你会发现$dateToday甚至不是一个字符串而是一个PHP日期时间对象,你不能直接在mysql查询中使用它(mysql对PHP一无所知)。所以你需要使用STR_TO_DATE将其转换为字符串也请注意,占位符('d','M','Y'等)在mysql中与PHP中使用的不同,查找完整列表{{3} }。

$dateToday = DateTime::createFromFormat('D d M, Y', date(' D d M, Y'))->format('Y-m-d H:i:s');

$query = "SELECT * FROM offer WHERE STR_TO_DATE(date,'%a %d %b, %Y') < STR_TO_DATE('$dateToday','%a %d %b, %Y') LIMIT 1";

上述更正将解决您的问题。