SQL 在 ORACLE DB 上搜索多个间隔时间



我正在对一个表进行查询,在该表中,我必须计算不同 1 小时间隔时间(例如从 13:00:00 到 14:00:00)的所有记录。我现在正在做的是这样的:

select count (*)
from tabel
where TO_CHAR(ins_ts, 'DD-MON-YYYY HH24') like ('02-GIU-2015 13');

结果:23

select count (*)
from tabel
where TO_CHAR(ins_ts, 'DD-MON-YYYY HH24') like ('02-GIU-2015 14');

结果:25

但是,在

一周中所有的日子里,每隔 1 小时就这样做太费力了。有没有办法进行查询,至少每天返回以不同时间间隔拆分的所有结果,如下所示:

结果:23、25 等

您可以使用 GROUP BY 对每个间隔的计数进行分组。

例如

SQL> WITH DATA AS(
  2  SELECT TO_DATE('06/12/2015 13:00:00','MM/DD/YYYY HH24:MI:SS', 'nls_date_language=AMERICAN') dt FROM DUAL UNION ALL
  3  SELECT TO_DATE('06/12/2015 13:30:00','MM/DD/YYYY HH24:MI:SS', 'nls_date_language=AMERICAN') dt FROM DUAL UNION ALL
  4  SELECT TO_DATE('06/12/2015 14:00:00','MM/DD/YYYY HH24:MI:SS', 'nls_date_language=AMERICAN') dt FROM DUAL UNION ALL
  5  SELECT TO_DATE('06/12/2015 14:30:00','MM/DD/YYYY HH24:MI:SS', 'nls_date_language=AMERICAN') dt FROM DUAL UNION ALL
  6  SELECT TO_DATE('06/12/2015 15:30:00','MM/DD/YYYY HH24:MI:SS', 'nls_date_language=AMERICAN') dt FROM DUAL
  7  )
  8  SELECT TO_CHAR(dt, 'MM/DD/YYYY HH24', 'nls_date_language=AMERICAN') dt,
  9    COUNT(*)
 10  FROM DATA
 11  GROUP BY TO_CHAR(dt, 'MM/DD/YYYY HH24', 'nls_date_language=AMERICAN')
 12  ORDER BY dt
 13  /
DT              COUNT(*)
------------- ----------
06/12/2015 13          2
06/12/2015 14          2
06/12/2015 15          1
SQL>

您希望将时间值截断为最接近的小时并进行计数。 您的查询中具有基本组件,您只需要一个group by

select TO_CHAR(ins_ts, 'DD-MON-YYYY HH24') as thehour, count(*)
from tabel
group by TO_CHAR(ins_ts, 'DD-MON-YYYY HH24')
order by min(ins_ts) ;

order by min(ins_ts)按时间对值进行排序,因为首选输出格式没有自然排序顺序。

如果你

真的想在日期时间上使用索引,你需要停止使用ins_ts上的函数(在 where 子句中)。

select TO_CHAR(ins_ts, 'DD-MON-YYYY HH24'),count (*)
 from table where 
 ins_ts >= TO_DATE('01/JAN/2015 00:00:00', 'dd/mon/yyyy HH24:MI:SS')
 and ins_ts < TO_DATE('08/JAN/2015 00:00:00', 'dd/mon/yyyy HH24:MI:SS')
 group by TO_CHAR(ins_ts, 'DD-MON-YYYY HH24');

这应该为您提供 1 月 1 日至 7 日之间的每小时和每条记录的计数。(请注意,第二个ins_ts检查使用小于且不小于或等于)。

相关内容

  • 没有找到相关文章

最新更新