oracle中的Datepart函数

时间:2017-01-09 19:18:54

标签: oracle

我在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

非常感谢! 乔

3 个答案:

答案 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
;