Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在同一天的两个随机日期之间以1小时的间隔筛选日期_Sql_Oracle - Fatal编程技术网

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)
  • TRUNC(dt,'HH24')
    将日期截断为小时(分和秒 设置为0)
  • 我减去开始一小时的分钟和秒数 将
    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。