希望这是一个简单的解决方案,但我正在尝试过滤以下数据:-
我从数据库获得的日期基本上是一个时间戳。
这是我尝试的:
今天
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)
…
这不是真的工作。
任何的想法?
如果仅按日期选择,则将计算基于CURDATE(仅返回日期)而不是NOW(返回日期和时间)。这些示例将捕获日期范围内的所有时间:
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)
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
“本周”取决于您开始一周的哪一天;我留给你。您可以使用该DAYOFWEEK功能调整CURDATE()到适当的范围。
DAYOFWEEK
CURDATE()
附录 :OP的列类型为INTEGER,存储UNIX时间戳,而我的回答假定列类型为TIMESTAMP。这是使用UNIX时间戳记值执行所有相同操作并在索引建立索引后仍然保持优化的方法(就像上面的答案在TIMESTAMP索引建立索引时一样)…
INTEGER
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))
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')