希望这是一个简单的解决方案,但我正在尝试过滤以下数据: -
我从数据库获得的日期基本上是一个时间戳。
这就是我的尝试: -
今天
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)
...
它并没有真正起作用。
有什么想法吗?
答案 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)
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))
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')