3

我们有一个表,名称为“employeeReg”,其中包含字段

employeeNo | employeeName | Registered_on

这里Registered_on是一个时间戳。

我们需要在几天内按小时进行注册。例如。

08 年 1 月 1 日 : 12 - 01 PM : 1592 注册

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

有人可以建议对此进行查询。


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

4

2 回答 2

4

这与关于每天有多个条目时如何获取每天的最新记录的问题密切相关,但略有不同。(与很多很多 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 上为您验证 - 在 IBM Informix Dynamic Server 上使用EXTEND(Registered_on, YEAR TO HOUR)代替 的等效项可以正常工作TO_CHAR())。

如果您随后决定在没有条目的情况下希望在几个小时内出现零,那么您将需要创建一个您确实希望报告的所有小时的列表,并且您需要对该列表进行 LEFT OUTER JOIN 结果从这个查询。困难的部分是生成正确的列表——不同的 DBMS 有不同的方法。

于 2008-12-22T06:33:08.637 回答
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');
于 2008-12-22T11:09:52.543 回答