特定时间范围内的重叠计数
Posted
技术标签:
【中文标题】特定时间范围内的重叠计数【英文标题】:Overlapping counts for a specific time range 【发布时间】:2015-08-17 17:40:59 【问题描述】:我有一个查询,我试图在数据库中查找某个时间范围内查看某项内容的次数。
这是我目前的查询:
USE DB1
SELECT DISTINCT NAME,
COUNT(*) AS COUNT
FROM LOGS
WHERE EVENT = 'Viewed'
AND TIME BETWEEN '2015-04-22 00:00:00.000' AND '2015-07-24 00:00:00.000'
GROUP BY NAME
ORDER BY COUNT DESC;
这个查询成功地告诉我在这 3 个月的范围内查看了多少次,但是当我将时间范围缩短到三个不同的查询时,该特定行从:
TIME BETWEEN '2015-04-22 00:00:00.000' AND '2015-05-22 00:00:00.000';
TIME BETWEEN '2015-05-22 00:00:00.000' AND '2015-06-22 00:00:00.000';
TIME BETWEEN '2015-06-22 00:00:00.000' AND '2015-04-24 00:00:00.000';
然后,当我将不同的值相加时,它们不相等。事实上,它们比我在三个月范围内的第一个查询中获得的行数要高得多。我假设某些值是重叠的。我怎样才能解决这个问题?我检查了我的工作,我很确定第一个查询在时间范围内给了我正确的行数,但我需要更具体的数据
【问题讨论】:
【参考方案1】:X BETWEEN Y AND Z
翻译成
X >= Y AND X <= Z
因此,您应该对整个范围内的期间使用不同的查询,例如:
TIME >= '2015-04-22 00:00:00.000' AND TIME < '2015-05-22 00:00:00.000';
TIME >= '2015-05-22 00:00:00.000' AND TIME < '2015-06-22 00:00:00.000';
TIME >= '2015-06-22 00:00:00.000' AND TIME <= '2015-07-24 00:00:00.000';
上一个时间段的逻辑取决于您...例如,您可以将其重新排列为:
TIME >= '2015-06-22 00:00:00.000' AND TIME < '2015-07-25 00:00:01.000';
【讨论】:
感谢您的回复,但是这给了我与 BETWEEN 命令完全相同的输出。【参考方案2】:col BETWEEN a AND b
被计算为a <= col <= b
,因此您的时间范围内有一个重叠间隔
将这个从午夜改为午夜前一秒:
TIME BETWEEN '2015-04-22 00:00:00.000' AND '2015-04-22 23:59:59.999';
TIME BETWEEN '2015-05-22 00:00:00.000' AND '2015-05-22 23:59:59.999';
TIME BETWEEN '2015-06-22 00:00:00.000' AND '2015-04-24 23:59:59.999';
更新
试试这个:
TIME BETWEEN '2015-04-22 00:00:00' AND '2015-04-22 23:59:59';
TIME BETWEEN '2015-05-22 00:00:00' AND '2015-05-22 23:59:59';
TIME BETWEEN '2015-06-22 00:00:00' AND '2015-04-24 23:59:59';
【讨论】:
TIME
是什么 coltype?
TIME 的数据类型是日期时间
你试过我更新的答案了吗? mysql 无法处理 TIME
中的毫秒数,请参阅 dev.mysql.com/doc/refman/5.6/en/time.html
这只是给我一天,我需要整个月的数据。我相信日期已经过去了。
它也提供了比我之前的查询更多的行。我在 MS SQL Server 08 上以上是关于特定时间范围内的重叠计数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Boot + Prometheus + Grafana 确定时间范围内的准确请求计数