我们有一个名为'employeeReg'的表格,其中包含字段
employeeNo | employeeName | Registered_on
此处 Registered_on 是时间戳。
我们需要在一段时间内按小时进行注册。例如
01 Jan 08:12 - 01 PM:1592注册
01 Jan 08:01 - 02 PM:1020注册
有人可以建议查询。
我们使用Oracle 10gR2作为我们的数据库服务器。
答案 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');