从SQL中的时间戳,选择今天,昨天,本周,本月和两个日期之间的记录php mysql

时间:2013-06-19 18:18:41

标签: mysql date select filter

希望这是一个简单的解决方案,但我正在尝试过滤以下数据: -

  • 今天
  • 昨天
  • 本周
  • 本月
  • 在两个日期之间。

我从数据库获得的日期基本上是一个时间戳。

这就是我的尝试: -

  • 今天

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 1 DAY)
    
  • 昨天

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 7 DAYS)
    

...

它并没有真正起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:52)

如果您仅按日期进行选择,请将计算基于CURDATE(仅返回日期),而不是NOW(返回日期和时间)。这些示例将在白天范围内捕获所有时间:

  • 今天:WHERE timestamp >= CURDATE()
  • 昨天:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • 本月:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • 2013年6月3日和2013年6月7日这两个日期之间(请注意结束日期如何指定为6月8日,而不是6月7日):WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'

“本周”取决于你每周开始的那一天;我会留给你的。您可以使用DAYOFWEEK功能将CURDATE()调整到适当的范围。


附录:OP的列类型为INTEGER,存储了UNIX时间戳,我的答案假定列类型为TIMESTAMP。以下是如何使用UNIX时间戳值执行所有相同的操作,并且如果列已编制索引,仍然保持优化(如上面的答案将在TIMESTAMP列编制索引时执行)...

基本上,解决方案是将开始和/或结束日期包装在UNIX_TIMESTAMP函数中:

  • 今天:WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • 昨天:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • 本月:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • 2013年6月3日和2013年6月7日这两个日期之间(请注意结束日期如何指定为6月8日,而不是6月7日):WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')