以5分钟为一段分割一天的时间

根据题目就能知道需求,就是将一天的时间以5分钟一段给列出来。

SELECT to_date('2015-06-17','yyyy-mm-dd hh24:mi')+numtodsinterval((ROWNUM-1)*5,'minute') logtime FROM dual 
CONNECT BY ROWNUM<=TRUNC((TO_DATE('2015-06-17 23:59', 'yyyy-MM-dd hh24:mi:ss') - TO_DATE('2015-06-17', 'yyyy-mm-dd')) * 1440 / 5)+1

 

分析:

numtodsinterval(数字,单位字符),能够将数字转换成给定单位的时间。

Oracle给定一个这样的函数也挺有好处的,它能够很方便的将日期进行前推和后推。就像Java当中给定的Calendar这个类一样。

 

connect by 条件:转换一下,这里的条件其实是rownum<=288,也就是将一天以5分钟为一组能分成288组。这个connect by

相当于调用了一个递归函数。

用Java代码模拟这个connect by的作用如下:

 1 public class OracleConnectBy {
 2     public static void main(String[] args) {
 3         /*
 4          * 第一次查询时查询出的第一条记录情况,然后会去查看connect by 后面的条件。
 5          * 因为connect by后面的条件用到了此时的时间和rownum的条件,因此要将其
 6          * 传过去。
 7          */
 8           int rownum=1;            
 9           String date="2015-06-17 00:00"; 
10           connectBy(rownum,date);
11           
12     }
13     
14     /**
15      * 相当于connect by的作用。首先查看select子句阶段产生的rownum是否满足条件,如果
16      * 满足就会再一次进行select语句,select子句的作用就是将日期加5分钟,rownum加一,
17      * 每次执行完select字句后,又会查看connect by后面的条件是否满足。
18      * @param rownum
19      * @param date
20      */
21     public static void connectBy(int rownum,String date) {
22         if(rownum<=288) { //相当于connect by后面的条件
23             date=formatDate(date);   //下面的代码相当于select子句的作用
24             System.out.println(date);
25             rownum++;
26             date=add5Min(date);
27             connectBy(rownum,date);   //执行完select子句以后再次执行connect by
28         }
29     }
30     
31     public static String formatDate(String date) {
32         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
33         try {
34             date= sdf.format(sdf.parse(date));
35         } catch (ParseException e) {
36             e.printStackTrace();
37         }
38         return date;
39     }
40     
41     public static String add5Min(String date) {
42         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
43         try {
44             Date d=sdf.parse(date);
45             Calendar cal=Calendar.getInstance();
46             cal.setTime(d);
47             cal.add(Calendar.MINUTE, 5);
48             date=sdf.format(cal.getTime());
49         } catch (ParseException e) {
50             e.printStackTrace();
51         }
52         return date;
53     }
54 }

 

posted on 2015-06-17 14:46  飞机说之代码也疯狂  阅读(847)  评论(0编辑  收藏  举报