【问题标题】:MYSQL select where date within this dayMYSQL 选择这一天内的日期
【发布时间】:2012-03-30 19:12:59
【问题描述】:

我的查询如下所示:

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

这是否会计算date在一天内的行(从 12:00 开始;而不是在 24 小时内)?如果没有,我该怎么做?

【问题讨论】:

  • 我认为我的解决方案是WHERE DAYNAME(date) == CURDATE()。问题是DAYNAME 返回单词形式'Friday'。我需要数字形式,以便它可以与CURDATE() 进行比较。
  • 它将返回昨天的所有记录,从当天开始,而不仅仅是运行后 24 小时内的记录。
  • SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) 返回2012-03-29,所以>= '2012-03-29 是昨天和今天的所有记录。
  • 如果您只想要前 24 小时,请使用 NOW() 而不是 CURDATE()

标签: mysql date


【解决方案1】:

以下内容应该足以获取当天的记录:

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

正如 Michael 在 cmets 中指出的那样,它以当前形式查看过去两天内的所有记录。

>= 运算符仅在 date 实际上是 datetime 时才是必需的 - 如果它只是 date 类型,= 就足够了。

【讨论】:

  • 谢谢。您编写了解决方案,就像我编写自己的解决方案一样。 (不过,我使用 DATE(date) 来获取日期部分)。
  • @Hope4You - 酷!仅使用= 就足够了,而且实际上更正确,以防万一那里有未来的日期。
  • 我现在才想起使用DATE(date) 会阻止date 行上的索引工作。即使dateDATETIME,我也可以使用WHERE date >= CURDATE() 吗?它仍然只会从一天的一开始就获取行吗?
  • @Hope4You - 它应该仍然适合你。我实际上写了答案,认为date 可能是datetime
【解决方案2】:

解决办法如下:

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

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

【讨论】:

  • 这个解决方案在性能方面非常糟糕,它必须将该函数应用于表中的每一行,并与当前日期进行比较。使用大表会出现性能问题。
【解决方案3】:

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(*) 为数据库机器提供了更多优化计数的可能性,因此 COUNT(*) 通常(并非总是)比 COUNT(field) 快。

【讨论】:

  • 好答案 - 我认为您的示例中的运算符混淆了。
  • SELECT COUNT(*) 会不会更慢,因为* 表示所有行?
  • 实际上使用 INNODB COUNT(primary_id) 更快。 COUNT(*) 在大型 INNODB 表中可能会非常慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2012-10-17
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多