特定时间范围内的重叠计数

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 &lt;= col &lt;= 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 确定时间范围内的准确请求计数

当时间范围在两天之间时如何获取特定时间范围内的记录

SQL 重叠日期范围

使用 Spark DataFrames 在特定时间范围内获取唯一计数

显示特定时间范围内的事件

Excel:查找特定时间范围内的值