1.问题背景
开发oa系统中,提交申请单中不能出现同一个时间段提交两个申请单,包含上下午情况。
2.问题思路
1.如果是一个时间判断是否重复问题,则可以考虑生成文件编号时候,把时间日期生成订单编号,并且把订单编号设置成唯一,重复插入数据时候,则会提示唯一性报错,捕获到这个异常,然后就可以实现不重复时间段问题。
2.对于我现在问题时间段fromdate(起止时间),fromtime(起止上下午),todate(结束时间),totime(结束上下午) 当然可能这么设计不是很合理了,完全可以通过数据库中一个起始日期和结束日期进行存储。既然情况是这个情况,我们就进行此种情况解决。
1.此种情况用到的主要是数据库中内置函数(case when else end) 判断两种问题,相当于java代码中if....else... 我也是才知道在sql语句中直接可以进行if....else..编写回到我自己问题
CASE fromtime when '上午' THEN '9' when ' 下午' THEN '13' else fromtime end //起止上下午字段,转为24小时制数字,上午对应 9点,下午对应15点
2.上下午字段转化完,进行与起止时间和结束时间拼接,内置函数 CONCAT_WS(a,b,c) 三个参数,a拼接两个参数用啥字符,b拼接第一个参数,c拼接第二个参数
CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end)
至此,2017-5-12 上午 经过上面两步转换为 2015-5-12-9
3.字符串拼接完了转化为时间类型str_to_date('string','%Y-%m-%d-%H') //注意H小时一定要大写,否则转化为null ,当然这里‘%Y-%m’中‘-’是根据string 字符串中间隔符进行判断的,如果string字符串是 “2017:5:12” 则转化 str_to_date('2017:5:12','%Y:%m:%d') ,继续回到我们的问题上来啊,
STR_TO_DATE( CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end),"%Y-%m-%d-%H")
至此,就已经将我们需要的拼接成时间字段
3.上面的都是准备工作,接下来介绍,提交订单时间与数据库时间重复情况,如果重复则返回该订单信息
1.起止时间日期fromdate 在数据库中已存订单中间,fromdate(已存)<=fromdate<=todate(已存) 则无论提交todate是否在订单已存时间段内,还是在订单外面都重复
订单。
2.结束时间todate 在数据库已存订单中间, fromdate(已存) <=todate<=todate(已存) 则 无论提交fromdate在订单哪里,提交的订单都是重复的。
3.提交的订单包含数据库已存订单 ,提交fromdate<fromdate(已存) &&todate>todate(已存) 则也会出现订单提交
4.我们已经把字段拼接完成,转化更年-月-日-时 ,又把重复时间情况分析出来,那么我们就进行编写判断重复时间
的sql语句。
5.以上就是我对这个重复时间理解,有啥好的方法和建议欢迎指正,建议。我把sql代码也贴出来
public List<OaAttendanceAppBillTwo> findBill(AppUser user, String type,
String fromDate, String toDate,String fromTime,String toTime) {
//拼接时间段进行判断是否为重复日期
String fromDate1 = "";
if(fromTime.equals("上午")){
fromDate1 = fromDate+"-"+"9";
}else{
fromDate1 = fromDate+"-"+"13";
}
String toDate1 = "";
if(toTime.equals("上午")){
toDate1 = toDate+"-"+"9";
}else{
toDate1 = toDate+"-"+"13";
}
String hql = "from OaAttendanceAppBillTwo where (1=1 or attendanceType='"
+ type + "')and operatorId='" + user.getId() + "'";
hql = hql
+ "and((STR_TO_DATE(CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end)" +
",'%Y-%m-%d-%H')<=STR_TO_DATE('"
+ fromDate1
+ "','%Y-%m-%d-%H') and STR_TO_DATE(CONCAT_WS('-',toDate,CASE totime when '上午' THEN '9' when '下午' THEN '13' else totime end)" +
",'%Y-%m-%d-%H')>= STR_TO_DATE('"
+ fromDate1 + "','%Y-%m-%d-%H'))";
hql = hql
+ "or (STR_TO_DATE(CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end)" +
",'%Y-%m-%d-%H')<=STR_TO_DATE('"
+ toDate1
+ "','%Y-%m-%d-%H') and STR_TO_DATE(CONCAT_WS('-',toDate,CASE totime when '上午' THEN '9' when '下午' THEN '13' else totime end)" +
",'%Y-%m-%d-%H')>= STR_TO_DATE('"
+ toDate1 + "','%Y-%m-%d-%H'))";
hql = hql
+ "or (STR_TO_DATE(CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end)" +
",'%Y-%m-%d-%H')> STR_TO_DATE('"
+ fromDate1
+ "','%Y-%m-%d-%H') and STR_TO_DATE(CONCAT_WS('-',toDate,CASE totime when '上午' THEN '9' when '下午' THEN '13' else totime end)" +
",'%Y-%m-%d-%H')< STR_TO_DATE('"
+ toDate1
+ "','%Y-%m-%d-%H'))) and status!='已退回' and attendanceType!='个人信息修改' and attendanceType!='加班'"
+ " ORDER BY id DESC";
List<OaAttendanceAppBillTwo> listBill = findByHql(hql);
return listBill;
}
String fromDate, String toDate,String fromTime,String toTime) {
//拼接时间段进行判断是否为重复日期
String fromDate1 = "";
if(fromTime.equals("上午")){
fromDate1 = fromDate+"-"+"9";
}else{
fromDate1 = fromDate+"-"+"13";
}
String toDate1 = "";
if(toTime.equals("上午")){
toDate1 = toDate+"-"+"9";
}else{
toDate1 = toDate+"-"+"13";
}
String hql = "from OaAttendanceAppBillTwo where (1=1 or attendanceType='"
+ type + "')and operatorId='" + user.getId() + "'";
hql = hql
+ "and((STR_TO_DATE(CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end)" +
",'%Y-%m-%d-%H')<=STR_TO_DATE('"
+ fromDate1
+ "','%Y-%m-%d-%H') and STR_TO_DATE(CONCAT_WS('-',toDate,CASE totime when '上午' THEN '9' when '下午' THEN '13' else totime end)" +
",'%Y-%m-%d-%H')>= STR_TO_DATE('"
+ fromDate1 + "','%Y-%m-%d-%H'))";
hql = hql
+ "or (STR_TO_DATE(CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end)" +
",'%Y-%m-%d-%H')<=STR_TO_DATE('"
+ toDate1
+ "','%Y-%m-%d-%H') and STR_TO_DATE(CONCAT_WS('-',toDate,CASE totime when '上午' THEN '9' when '下午' THEN '13' else totime end)" +
",'%Y-%m-%d-%H')>= STR_TO_DATE('"
+ toDate1 + "','%Y-%m-%d-%H'))";
hql = hql
+ "or (STR_TO_DATE(CONCAT_WS('-',fromDate,CASE fromtime when '上午' THEN '9' when '下午' THEN '13' else fromtime end)" +
",'%Y-%m-%d-%H')> STR_TO_DATE('"
+ fromDate1
+ "','%Y-%m-%d-%H') and STR_TO_DATE(CONCAT_WS('-',toDate,CASE totime when '上午' THEN '9' when '下午' THEN '13' else totime end)" +
",'%Y-%m-%d-%H')< STR_TO_DATE('"
+ toDate1
+ "','%Y-%m-%d-%H'))) and status!='已退回' and attendanceType!='个人信息修改' and attendanceType!='加班'"
+ " ORDER BY id DESC";
List<OaAttendanceAppBillTwo> listBill = findByHql(hql);
return listBill;
}