一尘不染

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

mysql

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

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

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

这是我尝试的:

  • 今天

    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)
    

这不是真的工作。

任何的想法?


阅读 285

收藏
2020-05-17

共1个答案

一尘不染

如果仅按日期选择,则将计算基于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')
2020-05-17