如何使用MySQL测试日期和时间日期?

4

我的表格使用了日期时间格式 (YYYY-MM-DD HH:MM:SS),我想要展示今天的记录。

我的代码只有:

SELECT   * 
FROM     table 
WHERE    date = '$date' 
ORDER    BY score DESC

使用

$date = date("Y-m-d");

好的,正如预期的那样,它不起作用 :| 你们这里有解决方案吗?

4个回答

18

1
如果我没记错的话,像这样的解决方案中,对于“日期”列进行计算/转换时,每行表格都必须进行计算/转换--这将破坏可能已经设置在“日期”列上的索引使用机会。 - Pascal MARTIN
@Pascal:是的,我想是这样。我已经在我的答案中添加了澄清...同时,出于好奇心,我正在检查MySQL如何处理这个问题。 - Daniel Vassallo
@Daniel:好的,谢谢你的精确说明 :-) 我也很好奇,只是想知道我所认为的是不是真的。^^ - Pascal MARTIN
@Pascal:看起来你是对的:https://dev59.com/eHVD5IYBdhLWcg3wE3bz。当你需要使用索引时,你的解决方案是正确的。 - Daniel Vassallo
@Daniel:感谢你的搜索、更新和链接 :-) - Pascal MARTIN

4

您的日期是“2009-12-19”(或类似的日期,具体取决于日期),它被解释为“2009-12-19 00:00:00”。

在您的数据库中,您可能没有一个完全等于该时间的日期,因为您的日期可能长这样:“2009-12-19 12:15:32”。

解决方案是这样比较:

select *
from table
where date >= '2009-12-19'
    and date < '2009-12-20'

这将被解释为:

select *
from table
where date >= '2009-12-19 00:00:00'
    and date < '2009-12-20  00:00:00'

如果您不想计算出下一个日期的日期,您可以使用adddate函数:

select *
from table
where date >= '2009-12-19'
    and date < adddate('2009-12-19', interval 1 day)

因此,在您的情况下,像这样的代码应该可以解决问题:
select *
from table
where date >= '$date'
    and date < adddate('$date', interval 1 day)
order by score desc

有没有更优美的选项来编写它呢?无论如何感谢您的建议,这需要一些思考。 - David 天宇 Wong
1
胡;我们对“美丽”的定义似乎不太一致——至少我不认为这看起来“丑陋”,但是......;; 这种解决方案的优点是它应该使用您在“日期”列上拥有的索引(如果您在那个列上有任何索引,也许您应该)——而将“日期”列转换或对其进行计算的解决方案将删除使用索引的能力。 - Pascal MARTIN
什么是索引?而且,我认为Daniel Vassallo的解决方案更加简洁美观。 - David 天宇 Wong
1
呃... 600个字符不足以解释索引是什么,实际上 ^^ 但你可以先看一下手册的这一页:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html - Pascal MARTIN

0

当你选择数据时,你可能想要格式化它:

SELECT *, DATE_FORMAT(date, '%Y-%m-%d') AS dateformat FROM table
WHERE dateformat = '$date' ORDER BY score DESC

0
你正在比较日期时间和日期表达式,这就是为什么它不起作用的原因。使用Date()方法从datetime中返回日期部分,然后进行比较。WHERE DATE(date) = '$date' 应该可以解决问题。你可能需要使用别名来处理这个名称冲突。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接