select to_char((daybegin + (level - 1) * 5 / 1440), 'yyyy-mm-dd hh24:mi:ss') as newdaybegin
from (select (trunc(sysdate, 'dd')) as daybegin from dual)
connect by level <= 288
后面话单报表开发要用到,记录一下。
这个更好点:
select to_char((daybegin + (level - 1) * 5 / 1440) - 5 / 1440,
'yyyymmddhh24:mi:ss') as last5time,
to_char((daybegin + (level - 1) * 5 / 1440), 'yyyymmddhh24:mi:ss') as this5time
from (select (trunc(sysdate, 'dd')) as daybegin from dual)
connect by level <= 288
对于每5分钟的话单处理,我的想法是:
1
直接采用上面的sql预先生成一个每5分钟(含上5分钟和这个5分钟)的时间表。
可以一次性初始化一个列表(比如一次性初始1年的数据),然后程序启动时读取这个列表,根据最小的时间值(last5time上建立索引)进行统计。
这样可以防止因为程序异常(比如僵死,很久没有运行)而造成话单处理丢失的情况。
每次处理完成后,将该5分钟的时间值删除,下次程序直接提取最小的last5time值即可。
2
或者在时间间隔表上增加一列标志位(默认为0),标志位当前时间值是否被处理过,如果处理过则标记为1。
在该列上建立联合索引(本来想建立bitmap索引,但是bitmap索引列不推荐update操作,所以摒弃),这样不需要删除时间值,也可以防止索引碎片和倾斜。
个人感觉更好的方法是,按照1的方法,然后按照last5time建立为索引组织表即可。(这个方法可以防止段碎片!)