在同一天的两个随机日期之间间隔1小时过滤日期

时间:2016-07-06 13:51:06

标签: sql oracle

规则

一小时之间的任何记录都应计为一个。

数据

ID     DATE

1      06/07/2017 09:20:35
2      06/07/2017 10:20:35
3      06/07/2017 10:25:30
4      06/07/2017 10:40:35
5      06/07/2017 10:50:35
6      06/07/2017 11:25:30
7      06/07/2017 11:50:20
8      06/07/2017 15:25:30
9      06/07/2017 17:25:30
10     06/07/2017 17:30:30
11     06/07/2017 17:40:55

预期结果

count       date

5           06/07/2017

为什么呢?根据最短日期,一小时后的记录计为一个。像这样:

count       range_date

1           09:20:35 - 10:20:35
1           10:20:36 - 11:20:36
1           11:20:37 - 12:20:37
0           12:20:38 - 13:20:38
0           13:20:39 - 14:20:39
0           14:20:40 - 15:20:40
1           15:20:41 - 16:20:41
1           17:20:42 - 18:20:42

有任何建议吗? 由于我没有日期(最小/最大)规则,所以在一个标准中有一些东西。我只知道所有约会都在同一天。

我不想在每小时之间进行N次选择......

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,这是一个获得您正在寻找的结果的查询:

SELECT 
    TRUNC(dt) AS day, 
    COUNT(DISTINCT TRUNC(dt - 20 / (24 * 60) - (35 + TO_NUMBER(TO_CHAR(dt, 'HH24')) - 9) / (24 * 60 * 60), 'HH24')) AS hours
FROM yourtable
GROUP BY TRUNC(dt)
  • TRUNC(dt, 'HH24')将日期截断为小时(分钟和秒) 设置为0)
  • 我减去开始时间的分钟和秒数 "移" TRUNC更正时间段
  • TO_NUMBER(TO_CHAR(dt, 'HH24')) - 9)必须每小时添加一秒
  • COUNT DISTINCT你 计算不同时间的数量。
  • 如果初始小时是可变的(正如我想的那样),我认为最简单的方法是使用单独的查询,提取小时,分钟和秒,并将它们用作主查询输入中的变量

答案 1 :(得分:1)

您想要计算自每条记录的最早日期/时间以来的小时数。这是一种方法:

select trunc(dt), count(distinct trunc((dt - min_dt) / 24)) as num_hours
from (select t.*, min(dt) over (partition by trunc(dt) order by dt) as min_dt
      from t
     ) t
group by trunc(dt);

此表达式(dt - min_dt) / 24计算每个日期/时间与较早的小时之间的时间。 count(distinct)计算日期中所见的不同小时数。