20

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

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

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

这是我尝试过的:-

  • 今天

    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)
    

...

它并没有真正起作用。

任何想法?

4

1 回答 1

55

如果您仅按日期选择,则基于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')
于 2013-06-19T18:33:42.070 回答