在MYSQL中查询最近7天特定小时的数据
我有一个名为在MYSQL中查询最近7天特定小时的数据,mysql,Mysql,我有一个名为startTime的字段,其类型为DATETIME。我每小时有一些数据(每小时1行)。我想获取特定时间的最后7天(例如:01:00:00)。所以基本上,查询应该只返回7行 我如何在MySQL中做到这一点 select traffic from incomingTraffic WHERE ... 样本数据: +---------------------+---------------------+-----------+----------+ | startTime
startTime
的字段,其类型为DATETIME
。我每小时有一些数据(每小时1行)。我想获取特定时间的最后7天(例如:01:00:00
)。所以基本上,查询应该只返回7行
我如何在MySQL中做到这一点
select traffic from incomingTraffic WHERE ...
样本数据:
+---------------------+---------------------+-----------+----------+
| startTime | endTime | component | traffic |
+---------------------+---------------------+-----------+----------+
| 2015-05-01 00:00:00 | 2015-05-01 01:00:00 | rest | 29090345 |
| 2015-05-01 01:00:00 | 2015-05-01 02:00:00 | rest | 32224087 |
| 2015-05-01 02:00:00 | 2015-05-01 03:00:00 | rest | 35165799 |
| 2015-05-01 03:00:00 | 2015-05-01 04:00:00 | rest | 36903464 |
| 2015-05-01 04:00:00 | 2015-05-01 05:00:00 | rest | 40394130 |
| 2015-05-01 05:00:00 | 2015-05-01 06:00:00 | rest | 44874862 |
| 2015-05-01 06:00:00 | 2015-05-01 07:00:00 | rest | 49988600 |
| 2015-05-01 07:00:00 | 2015-05-01 08:00:00 | rest | 52240544 |
| 2015-05-01 08:00:00 | 2015-05-01 09:00:00 | rest | 54517705 |
| 2015-05-01 09:00:00 | 2015-05-01 10:00:00 | rest | 55277967 |
| 2015-05-01 10:00:00 | 2015-05-01 11:00:00 | rest | 55285309 |
| 2015-05-01 11:00:00 | 2015-05-01 12:00:00 | rest | 55572614 |
| 2015-05-01 12:00:00 | 2015-05-01 13:00:00 | rest | 54507826 |
| 2015-05-01 13:00:00 | 2015-05-01 14:00:00 | rest | 52430349 |
| 2015-05-01 14:00:00 | 2015-05-01 15:00:00 | rest | 47084995 |
| 2015-05-01 15:00:00 | 2015-05-01 16:00:00 | rest | 41671868 |
| 2015-05-01 16:00:00 | 2015-05-01 17:00:00 | rest | 37492018 |
| 2015-05-01 17:00:00 | 2015-05-01 18:00:00 | rest | 34391610 |
| 2015-05-01 18:00:00 | 2015-05-01 19:00:00 | rest | 33814871 |
| 2015-05-01 19:00:00 | 2015-05-01 20:00:00 | rest | 32466192 |
| 2015-05-01 20:00:00 | 2015-05-01 21:00:00 | rest | 28703534 |
| 2015-05-01 21:00:00 | 2015-05-01 22:00:00 | rest | 25564237 |
| 2015-05-01 22:00:00 | 2015-05-01 23:00:00 | rest | 23209539 |
| 2015-05-01 23:00:00 | 2015-05-02 00:00:00 | rest | 24853381 |
| 2015-05-02 00:00:00 | 2015-05-02 01:00:00 | rest | 24090 |
| 2015-05-02 00:00:00 | 2015-05-02 01:00:00 | rest | 26848485 |
| 2015-05-02 01:00:00 | 2015-05-02 02:00:00 | rest | 28507177 |
| 2015-05-02 02:00:00 | 2015-05-02 03:00:00 | rest | 29970856 |
| 2015-05-02 03:00:00 | 2015-05-02 04:00:00 | rest | 30607213 |
| 2015-05-02 04:00:00 | 2015-05-02 05:00:00 | rest | 34005454 |
| 2015-05-02 05:00:00 | 2015-05-02 06:00:00 | rest | 38241748 |
| 2015-05-02 06:00:00 | 2015-05-02 07:00:00 | rest | 42154837 |
| 2015-05-02 07:00:00 | 2015-05-02 08:00:00 | rest | 44181502 |
| 2015-05-02 08:00:00 | 2015-05-02 09:00:00 | rest | 45787319 |
| 2015-05-02 09:00:00 | 2015-05-02 10:00:00 | rest | 47283634 |
| 2015-05-02 10:00:00 | 2015-05-02 11:00:00 | rest | 47328065 |
| 2015-05-02 11:00:00 | 2015-05-02 12:00:00 | rest | 47370131 |
| 2015-05-02 12:00:00 | 2015-05-02 13:00:00 | rest | 46298305 |
| 2015-05-02 13:00:00 | 2015-05-02 14:00:00 | rest | 43894081 |
| 2015-05-02 14:00:00 | 2015-05-02 15:00:00 | rest | 40307217 |
| 2015-05-02 15:00:00 | 2015-05-02 16:00:00 | rest | 35481808 |
| 2015-05-02 16:00:00 | 2015-05-02 17:00:00 | rest | 32316694 |
| 2015-05-02 17:00:00 | 2015-05-02 18:00:00 | rest | 30426755 |
| 2015-05-02 18:00:00 | 2015-05-02 19:00:00 | rest | 29809260 |
| 2015-05-02 19:00:00 | 2015-05-02 20:00:00 | rest | 28466543 |
| 2015-05-02 20:00:00 | 2015-05-02 21:00:00 | rest | 25392149 |
| 2015-05-02 21:00:00 | 2015-05-02 22:00:00 | rest | 21182582 |
| 2015-05-02 22:00:00 | 2015-05-02 23:00:00 | rest | 20954845 |
除了数据应小于7天的条件外,还应添加
hour()=1的条件
很抱歉,我花了一些时间收集其他碎片并将其正确处理;-) 您可以使用a获得7天,并将小时与匹配,这将为您提供日期的小时部分
SELECT startTime, traffic FROM incomingTraffic
WHERE
startTime > DATE_SUB('2015-05-01', INTERVAL 7 DAY)
AND HOUR(startTime) = 1;
请注意,我没有NOW()
,因为您的示例数据是过去的。还要注意的是,您应该首先检查日期范围,然后进行小时比较,因为这要便宜得多,因为mysql需要进行转换来检查小时。这个问题比看起来更棘手,因为它取决于数据更新的方式以及OP所说的“最后7天”的真正含义
如果要查看相对于当前日期的最后7天,请使用:
WHERE hour(startTime) = 7 AND
startTime >= date_sub(CURDATE(), interval 7 day)
现在,这可能需要7天或8天,具体取决于数据的更新方式和当前时间。您可以按startTime DESC LIMIT 7添加订单,以获得整整7天
如果要在表中列出最近7天的时间,请尝试以下方法:
SELECT traffic
FROM incomingTraffic
WHERE hour(startTime) = 7
ORDER BY startTime DESC
LIMIT 7;
这将获得数据中最近的7天。然而,如果您有一个大的表,这可能是低效的。在startTime
上有一个WHERE
子句将使查询更有效。从小时(startTime)=1和startTime=DATE_SUB(startTime,INTERVAL 7 DAY)的incomingTraffic中选择*无可否认,这不是最全面、最优雅的解决方案——Gordon理所当然地在这里获奖,既然他考虑到了所有可能发生的事情,那为什么要投否决票呢?
SELECT traffic
FROM incomingTraffic
WHERE hour(startTime) = 7
ORDER BY startTime DESC
LIMIT 7;