我在Oracle 12中有一些示例记录
Date_Time Item
10/1/2012 12:05:00 AM 3
12/3/2012 06:00:00 AM 2
11/8/2012 14:05:05 PM 10
12/9/2012 16:00:59 PM 5
我喜欢根据军事时间或三个不同时间汇总项目字段:00:00:00 AM到05:59:00 AM,06:00:00 AM到15:59:00 PM,以及16:00:00 PM到下午23:59:00我能够在SQL中使用Datepart函数来执行此操作。我想知道Oracle 12中的哪个函数允许我在这三个不同的时间之间计算项目。
我想要的输出是:
Date_Time Count
00:00:00AM to 05:59:00AM = 3
06:00:00AM to 15:59:00PM = 12
16:00:00PM to 23:59:00PM = 5
非常感谢! 乔
答案 0 :(得分:1)
在oracle中,date数据类型包含日期+时间,所以你只需要使用group by
SELECT Date_Time, COUNT(*) item FROM YOUR_TABLES
GROUP BY Date_Time;
新答案:
SELECT TO_CHAR(DATE_TIME,'HH24') time, count(*) FROM YOUR_TABLE
WHERE TO_CHAR(DATE_TIME,'HH24') >= '00'
AND TO_CHAR(DATE_TIME,'HH24') < '06'
GROUP BY TO_CHAR(DATE_TIME,'HH24')
UNION ALL
SELECT TO_CHAR(DATE_TIME,'HH24') time, count(*) FROM YOUR_TABLE
WHERE TO_CHAR(DATE_TIME,'HH24') >= '06'
AND TO_CHAR(DATE_TIME,'HH24') < '16'
GROUP BY TO_CHAR(DATE_TIME,'HH24')
UNION ALL
SELECT TO_CHAR(DATE_TIME,'HH24') time, count(*) FROM YOUR_TABLE
WHERE TO_CHAR(DATE_TIME,'HH24') >= '16'
AND TO_CHAR(DATE_TIME,'HH24') < '00'
GROUP BY TO_CHAR(DATE_TIME,'HH24');
如果你的桌子很大: 第一:分区 第二:在TO_CHAR上创建本地功能索引(DATE_TIME,'HH24:MI:SS')
答案 1 :(得分:1)
假设date_time
列是数据类型DATE
,我们可以使用TO_CHAR函数提取00到23范围内的两个字符表示....
(所选答案演示了从Oracle DATE中提取“小时”的方法。)
假设我们希望每个非空时间值都落入三个时间范围之一......也就是说,如果我们不希望由于范围之间的裂缝/间隙而忽略任何时间值,我们不希望范围内有任何重叠......
我们可以在CASE表达式中使用简单的“小于”测试。
考虑接近边界的时间:'05:59:33'。这是在05:59:00
之后但在06:00:00
之前。如果我们想要包含在第一个范围内,我们可以测试小时&lt; '06'。
如果将行分组为三个范围,并且我想要总共item
列,我会做这样的事情:
SELECT CASE
WHEN TO_CHAR( t.date_time ,'HH24') < '06' THEN '00:00:00 to 05:59:59'
WHEN TO_CHAR( t.date_time ,'HH24') < '16' THEN '06:00:00 to 15:59:59'
WHEN TO_CHAR( t.date_time ,'HH24') < '24' THEN '16:00:00 to 23:59:59'
END AS time_range
, SUM(t.item)
FROM mytable t
GROUP
BY CASE
WHEN TO_CHAR( t.date_time ,'HH24') < '06' THEN '00:00:00 to 05:59:59'
WHEN TO_CHAR( t.date_time ,'HH24') < '16' THEN '06:00:00 to 15:59:59'
WHEN TO_CHAR( t.date_time ,'HH24') < '24' THEN '16:00:00 to 23:59:59'
END
如果我想按特定顺序返回结果,请添加ORDER BY
子句。
如果表包含date_time
的任何NULL值,则上面的查询也将返回带有NULL值的第四个time_range
。
答案 2 :(得分:1)
以下是如何在三列(而不是三行)中获得所需结果,这对大多数应用程序更有意义。您可以轻松地更改此设置以获得行结果。
请注意,如果dt
是Oracle中的任何日期,dt - trunc(dt)
是自午夜以来的天数(值小于1的分数)。
select sum(case when dt-trunc(dt) < 6/24 then item else 0 end) as morning,
sum(case when dt-trunc(dt) >= 6/24
and dt-trunc(dt) < 16/24 then item else 0 end) as daytime,
sum(case when dt-trunc(dt) >= 16/24 then item else 0 end) as evening
from your_table
;