我正在对一个表进行查询,在该表中,我必须计算不同 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检查使用小于且不小于或等于)。