如果您仅按日期选择,则基于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')