2012-03-30 44 views
3

我的查询看起来是这样的范围内:MYSQL选取日这一天

SELECT COUNT(entryID) 
FROM table 
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) 

这会不会算,其date一天中的行(在12点开始,24小时内没有)?如果不是,我该怎么做?

+0

我觉得我的解决办法是'WHERE DAYNAME(日期)== CURDATE()'。问题是'DAYNAME'返回单词形式'Friday'。我需要数字形式,以便它可以与'CURDATE()'进行比较。 – Hope4You 2012-03-30 19:16:38

+0

它将返回昨天的所有记录,从一天开始,不仅在运行24小时内的记录。 – 2012-03-30 19:18:30

+1

'选择DATE_SUB(CURDATE(),间隔1天)''返回2012-03-29',所以'> =“2012-03-29'是从昨天和今天的所有记录。 – 2012-03-30 19:19:14

回答

8

下应该足以当前一天之内获得记录:

SELECT COUNT(entryID) 
FROM table 
WHERE date >= CURDATE() 

正如迈克尔在评论中指出,它着眼于所有记录在其目前的形式在过去两天内。

>=运营商是唯一必要的,如果date实际上是一个datetime - 如果它只是一个date类型,=应该足够了。

+0

感谢。你写了解决方案,因为我正在写自己的解决方案。 (尽管我使用'DATE(date)'来获取日期部分)。 – Hope4You 2012-03-30 19:21:44

+0

@ Hope4You - 酷!只要使用'='应该就足够了,并且在那里有将来的日期的情况下更加正确。 – 2012-03-30 19:27:43

+0

我只记得现在使用'DATE(date)'会停止行'日期'行上的索引。即使“date”是'DATETIME',它是否会对我使用'WHERE date> = CURDATE()'?它仍然只能从一天的开始获得排? – Hope4You 2012-04-02 18:10:37

2

这里的解决方案:

SELECT COUNT(entryID) FROM table WHERE DATE(date) >= CURDATE()

由于我date列的类型DATETIME,我用DATE(date)只得到的日期部分,而不是时间的一部分。

+3

该解决方案性能非常差,它必须将该函数应用于表中的每一行,并与当前日期之后进行比较。用一张大桌子会出现性能问题。 – Jokin 2013-10-01 13:39:25

1

CURDATE()返回像 '2012-03-30',而不是一个如 '2012-03-30 21点38分17秒' 的时间戳的日期。一天的减法也只返回日期,而不是时间戳。如果你想把一个日期看作一个时间戳,把它看作是那一天的开始,意思是'00:00:00'的时间。

这是什么原因,为什么这个

WHERE date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) 

WHERE date > CURDATE() 

这样做。

我有另一条线索:SELECT COUNT(entryID)SELECT COUNT(*)给出相同的结果。 SELECT COUNT(*)给数据库机器更posibilities优化计数,所以COUNT(*)通常(不总是)比COUNT(field)更快。

+0

好的答案 - 我认为你的运营商混淆了你的例子。 – 2012-03-30 19:41:24

+0

因为'*'表示所有行,所以'SELECT COUNT(*)'会更慢吗? – Hope4You 2012-04-02 18:07:55

+0

实际上,对于INNODB,“COUNT(primary_id)”更快。 COUNT(*)'在一个大的INNODB表中可能非常缓慢。 – earl3s 2016-02-17 02:55:15