Sql 在同一天的两个随机日期之间以1小时的间隔筛选日期
规则 一小时之间的任何记录都应计为一条记录 数据Sql 在同一天的两个随机日期之间以1小时的间隔筛选日期,sql,oracle,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
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次选择…如果我正确理解了您的问题,这是一个可以获得您要查找的结果的查询:
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)
将日期截断为小时(分和秒 设置为0)TRUNC(dt,'HH24')
- 我减去开始一小时的分钟和秒数
将
切换到正确的时间段TRUNC
必须每小时增加一秒钟TO_NUMBER(TO_CHAR(dt,'HH24'))-9)
- 使用
计算不同的小时数countdistinct
- 如果初始小时是可变的(如我所想),我认为最简单的方法是使用单独的查询保存它,提取小时、分钟和秒,并将它们用作主查询的输入变量
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);
此表达式计算每个日期/时间与较早日期/时间之间的时间(以小时为单位)。
count(distinct)
计算在日期中看到的不同小时数。不清楚您在计算什么。哪些间隔在输入表中至少有一行?另外:你对“时间范围”的定义(不清楚为什么它被称为“日期范围”,因为所有时间都在同一个日期)没有意义。一个小时的间隔应该是从9:20:35到10:20:34,然后是从10:20:35到11:20:34等等。。。一个“范围”(又名间隔)在09:20:35到10:20:35之间。另一个:10:20:36到11:20:36。我在计算从最短日期开始一小时到最长日期之间的所有时间…我认为您示例的最后一行必须是18:20:42,而不是18:20:41为什么您希望间隔为3601秒?(特别是当标题显示正好是一小时时)我认为此查询在所有时间间隔中都保持相同的秒值,但在示例中,秒数增加:每个时间间隔都是一小时一秒长,但很容易修复。在解决方案中(dt-min_dt)乘以1/24,从“天”转换为“小时”(在Oracle日期/时间算法中,1是一天)。为了检查1小时1秒的整数倍而不是1小时,应将(dt-min_dt)乘以3601/86400。(请注意,一小时是3600秒,一天是86400秒。)这看起来正确,但过于复杂。Gordon的解决方案更简单,并且本着同样的精神。它只需要使用(dt-min_dt)*3601/86400来计算每小时额外的秒数,而不是(dt-min_dt)/24。