使用SQL获取每小时统计信息

时间:2008-12-22 06:11:07

标签: sql oracle oracle10g report

我们有一个名为'employeeReg'的表格,其中包含字段

employeeNo | employeeName | Registered_on

此处 Registered_on 是时间戳。

我们需要在一段时间内按小时进行注册。例如

  

01 Jan 08:12 - 01 PM:1592注册

     

01 Jan 08:01 - 02 PM:1020注册

有人可以建议查询。


我们使用Oracle 10gR2作为我们的数据库服务器。

2 个答案:

答案 0 :(得分:4)

这与How to get the latest record for each day when there are multiple entries per day这个问题密切相关,但略有不同。 (许多SQL问题有一个共同点 - 表名最初没有给出!

基本技术将是找到一个函数,该函数将格式化各种Registered_on值,以便将特定小时内的所有条目组合在一起。这大概可以用TO_CHAR()来完成,因为我们正在处理Oracle(MySQL不支持这个)。

SELECT TO_CHAR(Registered_on, "YYYY-MM-DD HH24") AS TimeSlot,
       COUNT(*) AS Registrations
    FROM EmployeeReg
    GROUP BY 1
    ORDER BY 1;

您可以通过TimeSlot或TO_CHAR()表达式替换“1”条目;但是,出于向后兼容性的原因,它可能会按照书面形式工作(但我无法在Oracle上验证 - 使用EXTEND(Registered_on, YEAR TO HOUR)代替{{1}在IBM Informix Dynamic Server上运行正常})。

如果您确定在没有条目的情况下要求零出现几个小时,那么您需要创建一个列表,列出您想要报告的所有小时数,并且您需要对该列表进行LEFT OUTER JOIN使用此查询的结果。困难的部分是生成正确的列表 - 不同的DBMS有不同的方法。

答案 1 :(得分:2)

通过 :)达到了我想要的效果。

SELECT TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24') AS TimeSlot,
       COUNT(*) AS Registrations
    FROM EmployeeReg a
    Group By TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24');
相关问题