时间工具类,主要用于sql的时间段查询

 该类主要服务于sql中基于时间的统计查询,在写sql的过程中建议不要使用to_char或者to_date等oracle函数这样不利用索引(除非你对to_char进行了类似索引的操作),比如:在表的logintime字段上建立了索引,但是在sql中使用to_char(logintime,'yyyy-MM-dd')作为检索条件的时候,数据库在logintime上建立的索引就没用了。在数据量很大的时候会影响检索的速度。 
   该类提供如下方法: 
   1、获取系统按天截取时间 getSystemTranceDay(); 
   2、根据指定时间提供天、周、旬、月、季度、年的开始时间,结束时间(时间格式采java.util.Date),以Date数组的形式返回开始和结束时间。 
   3、给定字符串类型的startTime和endTime,工具类负责类型的转换(String转换成Date) 
   注意: 
   1、在sql中使用开始时间和最后时间的时候,为了保证统计数据的正确性, 
     sql按给出的例子组织:t.logintime >= startTime and t.loginTime <= entTime 
   2、时间的字符串格式采用 yyyy-MM-dd 
   3、使用该类的时候,注意返回结果的正确性,虽然单元测试通过,还是担心有数据不正确的问题。 
   4、工具类以附件形式提供。 

Java代码   收藏代码
  1. import java.text.ParseException;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.regex.Matcher;  
  6. import java.util.regex.Pattern;  
  7. import java.util.zip.DataFormatException;  
  8.   
  9. import org.apache.commons.lang.time.DateUtils;  
  10. import com.pengsy.commons.stringutil.StringUtil;  
  11.   
  12. /** 
  13.  * 该类主要服务于sql中基于时间的统计查询,在写sql的过程中建议不要使用to_char或者to_date等oracle函数 
  14.  * 这样不利用索引(除非你对to_char进行了类似索引的操作 
  15.  * ),比如:在表的logintime字段上建立了索引,但是在sql中使用to_char(logintime,'yyyy-MM-dd') 
  16.  * 作为检索条件的时候,数据库在logintime上建立的索引就没用了。在数据量很大的时候会影响检索的速度。 
  17.  *  提供如下方法:  
  18.  *  1、获取当前时间(按天截取时间) 
  19.  *  2、根据指定时间提供天、周、旬、月、季度、年的开始时间,结束时间(时间格式采java.util.Date) 
  20.  *  3、给定字符串类型的startTime和endTime,工具类负责类型的转换(String转换成Date)  
  21.  *  注意: 
  22.  *  1、在sql中使用开始时间和最后时间的时候,为了保证统计数据的正确性, 
  23.  *    sql按给出的例子组织:t.logintime >= startTime and t.loginTime <= entTime  
  24.  *  2、时间的字符串格式采用 yyyy-MM-dd 
  25.  *  
  26.  */  
  27.   
  28. public final class DateUtil {  
  29.   
  30.     private static SimpleDateFormat sDateFormat = new SimpleDateFormat(  
  31.             "yyyy-MM-dd");  
  32.   
  33.     public static final int FIRSTTEN = 1 ;  
  34.     public static final int MIDTEN = 2;  
  35.     public static final int LASTTEN = 3;  
  36.       
  37.     public static final int FIRSTQUARTER = 1;  
  38.     public static final int SECONDQUARTER = 2;  
  39.     public static final int THIRDQUARTER = 3;  
  40.     public static final int FORTHQUARTER = 4;  
  41.       
  42.     private static Pattern pattern = Pattern  
  43.             .compile("^[1-9]\\d{3}-[01]?\\d-[0|1|2|3]?\\d$"); // 2010-12-22  
  44.   
  45.     /** 
  46.      * 获取当前系统时间按天截取的时间 
  47.      * @return 
  48.      */  
  49.     public static Date getSystemTranceDay(){  
  50.         return DateUtils.truncate(new Date(), Calendar.DATE);  
  51.     }  
  52.       
  53.     /** 
  54.      * 功能:根据指定时间获取当前天的开始和结束时间,以date数组返回 
  55.      * 逻辑: 
  56.      * 1、appointDate is null ,set default value sysdate 
  57.      * 2、get date[] 
  58.      * @param appointDate 
  59.      * @return 
  60.      */  
  61.     public static Date[] getDateArrByDay(Date appointDate){  
  62.         Date stime = null;  
  63.         Date etime = null;  
  64.         Date[] date = new Date[2];  
  65.         //未完  
  66.         if(appointDate == null){  
  67.             appointDate = new Date();  
  68.         }  
  69.         stime = DateUtils.truncate(appointDate,Calendar.DATE);  
  70.         etime = DateUtils.addSeconds(DateUtils.truncate(DateUtils.addDays(appointDate, 1), Calendar.DATE),-1);  
  71.           
  72.         date[0] = stime;  
  73.         date[1] = etime;  
  74.         return date;  
  75.     }  
  76.       
  77.     /** 
  78.      * 功能:根据指定时间获取当前星期的开始和结束时间,以date数组返回 
  79.      * @param appointDate 
  80.      * @return 
  81.      */  
  82.     public static Date[] getDateArrByWeek(Date appointDate){  
  83.         Date stime = null;  
  84.         Date etime = null;  
  85.         Date[] date = new Date[2];  
  86.         if(appointDate == null){  
  87.             appointDate = new Date();  
  88.         }  
  89.           
  90.         Calendar calendar = Calendar.getInstance();  
  91.         calendar.setTime(appointDate);  
  92.         int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);  
  93.         System.out.println(dayOfWeek);  
  94.           
  95.         calendar.add(Calendar.DAY_OF_MONTH, -dayOfWeek+2);  
  96.           
  97.         stime = DateUtils.truncate(calendar.getTime(), Calendar.DATE);  
  98.         calendar.add(Calendar.DAY_OF_MONTH, 7);  
  99.         etime = DateUtils.addSeconds(DateUtils.truncate(calendar.getTime(), Calendar.DATE), -1);  
  100.           
  101.         date[0] = stime;  
  102.         date[1] = etime;  
  103.           
  104.         return date;  
  105.     }  
  106.       
  107.     /** 
  108.      * 功能:根据指定的时间和上中下旬的其中一个,获取开始时间和结束时间 
  109.      * @param appointDate 
  110.      * @param appointIndex 
  111.      * @return 
  112.      */  
  113.     public static Date[] getDateArrByTenDays(Date appointDate,int appointIndex ){  
  114.         Date stime = null;  
  115.         Date etime = null;  
  116.         Date[] date = new Date[2];  
  117.         if(appointDate == null){  
  118.             appointDate = new Date();  
  119.         }  
  120.         //init date  
  121.         Calendar calendar = Calendar.getInstance();  
  122.         calendar.setTime(appointDate);  
  123.         int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);  
  124.         int maxDayOfMonth = calendar.getMaximum(Calendar.DAY_OF_MONTH);  
  125.           
  126.         Date tempDate = DateUtils.truncate(DateUtils.addDays(appointDate, -dayOfMonth + 1), Calendar.DATE);  
  127.           
  128.         if(appointIndex == FIRSTTEN){  
  129.             stime = tempDate;  
  130.             etime = DateUtils.addSeconds(DateUtils.addDays(stime, 10), -1);  
  131.         }  
  132.           
  133.         if(appointIndex == MIDTEN){  
  134.             stime = DateUtils.addDays(tempDate, 10);  
  135.             etime = DateUtils.addSeconds(DateUtils.addDays(stime, 10), -1);  
  136.         }  
  137.           
  138.         if(appointIndex == LASTTEN){  
  139.             stime = DateUtils.addDays(tempDate, 20);  
  140.             etime = DateUtils.addSeconds(DateUtils.addDays(tempDate, maxDayOfMonth), -1);  
  141.         }  
  142.           
  143.         date[0] = stime;  
  144.         date[1] = etime;   
  145.         return date;  
  146.     }  
  147.       
  148.     /** 
  149.      * 功能:根据指定时间获取相应月份的开始时间和结束时间 
  150.      * @param appointDate 
  151.      * @return 
  152.      */  
  153.     public static Date[] getDateArrByMonth(Date appointDate){  
  154.         Date stime = null;  
  155.         Date etime = null;  
  156.         Date[] date = new Date[2];  
  157.         if(appointDate == null){  
  158.             appointDate = new Date();  
  159.         }  
  160.           
  161.         //init date  
  162.         Calendar calendar = Calendar.getInstance();  
  163.         calendar.setTime(appointDate);  
  164.         int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);  
  165.         int maxDayOfMonth = calendar.getMaximum(Calendar.DAY_OF_MONTH);  
  166.           
  167.         appointDate = DateUtils.truncate(appointDate, Calendar.DATE);  
  168.           
  169.         stime = DateUtils.truncate(DateUtils.addDays(appointDate, -dayOfMonth+1), Calendar.DATE);  
  170.         etime = DateUtils.addSeconds(DateUtils.addDays(stime, maxDayOfMonth), -1);  
  171.           
  172.         date[0] = stime;  
  173.         date[1] = etime;  
  174.           
  175.         return date;  
  176.     }  
  177.       
  178.     /** 
  179.      * 功能:根据指定时间所在的当前年,获取指定季度的开始时间和结束时间 
  180.      * @param appointDate 指定当前年 
  181.      * @param appointIndex 
  182.      * @return 
  183.      * @throws IllegalArgumentException 
  184.      */  
  185.     public static Date[] getDateArrByQuarter(Date appointDate,int appointIndex) throws IllegalArgumentException{  
  186.         Date stime = null;  
  187.         Date etime = null;  
  188.         Date[] date = new Date[2];  
  189.         if(appointDate == null){  
  190.             appointDate = new Date();  
  191.         }  
  192.         int month = appointDate.getMonth();  
  193.         Date tempDate = DateUtils.truncate(appointDate, Calendar.YEAR);  
  194.         if(appointIndex == FIRSTQUARTER){  
  195.             stime = tempDate;  
  196.         }else if(appointIndex == SECONDQUARTER){  
  197.             stime = DateUtils.addMonths(tempDate, 3);  
  198.         }else if(appointIndex == THIRDQUARTER ){  
  199.             stime = DateUtils.addMonths(tempDate, 6);  
  200.         }else if(appointIndex == FORTHQUARTER){  
  201.             stime = DateUtils.addMonths(tempDate, 9);  
  202.         }  
  203.         etime = DateUtils.addSeconds(DateUtils.addMonths(stime, 3), -1);  
  204.           
  205.         date[0] = stime;  
  206.         date[1] = etime;  
  207.           
  208.         return date;  
  209.     }  
  210.       
  211.     /** 
  212.      * 功能:根据指定时间,获取年的开始时间和结束时间 
  213.      * @param appointDate 
  214.      * @return 
  215.      */  
  216.     public static Date[] getDateArrByYear(Date appointDate){  
  217.         Date stime = null;  
  218.         Date etime = null;  
  219.         Date[] date = new Date[2];  
  220.         if(appointDate == null){  
  221.             appointDate = new Date();  
  222.         }  
  223.         stime = DateUtils.truncate(appointDate, Calendar.YEAR);  
  224.         etime = DateUtils.addSeconds(DateUtils.addYears(stime, 1), -1);  
  225.           
  226.         date[0] = stime;  
  227.         date[1] = etime;  
  228.           
  229.         return date;  
  230.     }  
  231.       
  232.     /** 
  233.      * 逻辑: 1、检查startTime,endTime的有效性(是否为空,数据格式), 异常处理: 1、两个参数都为空,抛出空指针异常 
  234.      * 2、数据格式不对,直接抛出 3、一个参数为空,另一个参数格式正确的情况下,为空的参数采用系统时间,为了保证startTime <= 
  235.      * endTime,工具类会做适当的调整 2、转换 3、返回值是个Date[2]数组,date[0] 保存startTime值,date[1] 
  236.      * 保存startTime值,其中startTime <= endTime 
  237.      *  
  238.      * @param startTime 
  239.      * @param endTime 
  240.      * @return 
  241.      */  
  242.     public static Date[] convertDateClass(String startTime, String endTime)  
  243.             throws NullPointerException, DataFormatException, ParseException {  
  244.         Date stime = null;  
  245.         Date etime = null;  
  246.         Date[] date = new Date[2];  
  247.   
  248.         if (StringUtil.isEmpty(startTime) && StringUtil.isEmpty(endTime)) {  
  249.             throw new NullPointerException("两个参数不能同时为空");  
  250.         }  
  251.   
  252.         if (StringUtil.isEmpty(startTime) && !StringUtil.isEmpty(endTime)) {  
  253.             // 先判断endTime格式是否正确  
  254.             Matcher matcher = pattern.matcher(endTime);  
  255.             if (matcher.matches()) {  
  256.                 stime = DateUtils.truncate(new Date(), Calendar.DATE); // 当天的开始时间,比如:当前时间为2010-12-27 11:31:30 这里stime的时间是2010-12-27 0:0:0  
  257.                 etime = DateUtils.truncate(sDateFormat.parse(endTime),Calendar.DATE);  
  258.             } else {  
  259.                 throw new DataFormatException(  
  260.                         "参数endTime的格式不正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");  
  261.             }  
  262.         }  
  263.         if (!StringUtil.isEmpty(startTime) && StringUtil.isEmpty(endTime)) {  
  264.             Matcher matcher = pattern.matcher(startTime);  
  265.             if (matcher.matches()) {  
  266.                 // 提供转换  
  267.                 etime = DateUtils.truncate(new Date(), Calendar.DATE); // 当天的开始时间,比如:当前时间为2010-12-27 11:31:30 这里stime的时间是2010-12-27 0:0:0  
  268.                 stime = DateUtils.truncate(sDateFormat.parse(startTime),Calendar.DATE);  
  269.             } else {  
  270.                 throw new DataFormatException(  
  271.                         "参数startTime的格式不正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");  
  272.             }  
  273.         }  
  274.   
  275.         if (!StringUtil.isEmpty(startTime) && !StringUtil.isEmpty(endTime)) {  
  276.             Matcher sMatcher = pattern.matcher(startTime);  
  277.             Matcher eMatcher = pattern.matcher(endTime);  
  278.             if (sMatcher.matches() && eMatcher.matches()) {  
  279.   
  280.                 stime = DateUtils.truncate(sDateFormat.parse(startTime),  
  281.                         Calendar.DATE);  
  282.                 etime = DateUtils.truncate(sDateFormat.parse(endTime),  
  283.                         Calendar.DATE);  
  284.   
  285.             } else {  
  286.                 throw new DataFormatException(  
  287.                         "请检查参数startTime、endTime的格式是否正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");  
  288.             }  
  289.   
  290.         }  
  291.   
  292.         if (!stime.before(etime)) {  
  293.             Date temp = stime;  
  294.             stime = etime;  
  295.             etime = temp;  
  296.             temp = null;  
  297.         }  
  298.           
  299.         date[0] = stime;  
  300.         date[1] = etime;  
  301.         return date;  
  302.     }  
  303. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你使用的是MySQL数据库,以下是JavaWeb中查询某一时间段的数据的代码实现: 1.首先,你需要在Java代码中编写SQL语句来查询数据。例如,下面的语句查询了某个表中在指定时间段内的数据: ```sql SELECT * FROM table_name WHERE date_column BETWEEN start_date AND end_date; ``` 其中,`table_name` 是你要查询的表名,`date_column` 是表中表示时间的列名,`start_date` 和 `end_date` 是你要查询时间段。 2.在JavaWeb中,你需要编写Servlet来接收前端传来的时间段参数,并且调用数据库查询数据。下面是一个简单的Servlet示例代码: ```java @WebServlet("/queryData") public class QueryDataServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 从前端获取时间段参数 String startDate = request.getParameter("startDate"); String endDate = request.getParameter("endDate"); // 调用数据库查询数据 try { Connection conn = DBUtil.getConnection(); String sql = "SELECT * FROM table_name WHERE date_column BETWEEN ? AND ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, startDate); pstmt.setString(2, endDate); ResultSet rs = pstmt.executeQuery(); // 处理查询结果 while (rs.next()) { // 获取每一行数据的各个字段值 String field1 = rs.getString("field1"); String field2 = rs.getString("field2"); // ... // 将数据传递给前端 // ... } // 关闭资源 rs.close(); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们使用了一个 `DBUtil` 工具类来获取数据库连接。在实际使用中,你需要根据自己的情况进行修改。另外,你还需要根据实际情况将查询结果传递给前端页面,例如使用 `request.setAttribute()` 和 `request.getRequestDispatcher().forward()` 等方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值