【问题标题】:SQL Searching multiple interval times on ORACLE DBSQL在ORACLE DB上搜索多个间隔时间
【发布时间】:2015-06-12 10:35:28
【问题描述】:

我正在对一个表进行查询,我必须在其中计算不同 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 database oracle datetime


【解决方案1】:

您可以使用 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>

【讨论】:

    【解决方案2】:

    您希望将时间值截断到最接近的小时并进行计数。您的查询中有基本组件,您只需要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) 将值按时间排序,因为您首选的输出格式没有自然的排序顺序。

    【讨论】:

      【解决方案3】:

      如果你真的想在日期时间使用索引,你需要停止使用 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 检查是使用小于且不小于或等于)。

      【讨论】:

        猜你喜欢
        • 2016-09-21
        • 2014-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多