Oracle组按工作时段和非工作时段

时间:2013-08-23 11:47:50

标签: sql oracle oracle11g oracle-sqldeveloper

我找不到解决方案如何在Oracle中使用Select by语句。

我需要按时间戳列分组工作时间段(“当天”的09:00到21:00)和第二个时间段(从前一天的21:01到“当天”的08:59) 在一个山区内。

欢迎任何建议。 感谢。

2 个答案:

答案 0 :(得分:1)

此分组的关键是从日期时间中减去9小时以获得“工作日期”,然后使用hour函数确定它是工作时间还是其他内容。这是一个例子:

select trunc(worktime - 9.0/24) as workdate,
       (case when hour(worktime) between 8 and 20 then 'WorkHours' else 'OtherHours' end),
       count(*)
from t
group by trunc(worktime - 9.0/24),
         (case when hour(worktime) between 8 and 20 then 'WorkHours' else 'OtherHours' end);

要检查特定月份,您可能希望使用workdate而不是实际日期(因此该月的前9个小时实际上是上个月的一部分)。

答案 1 :(得分:0)

group by 
       trunc(timestamp_col, 'MM')
     , case 
          when to_char(timestamp_col, 'hh24') between '08' and '20' 
          then 'work' 
          else 'other'
       end

trunc(timestamp_col, 'MM') - 给你一个月

case 
          when to_char(timestamp_col, 'hh24') between '08' and '20' 
          then 'work' 
          else 'other'
       end

- 给你“工作”或“其他”