以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 }