mysql 日期函数
问题
实现一个预约挂号功能中有一个查看订单的模块,要对客户的取消操作作出限制;
已预约未付款的,可以点击付款和取消,取消后作废状态;
已付款 未完成的,可以点击取消和完成,
? 取消的话则会触发:一周只能取消两次,一天只能取消一次;
? 限定只在工作日进行;
? 点击完成会调到评论页面;
前台:
前端触发:
<c:if test="${!empty os }"> <c:forEach items="${os }" var="o"> <tr> //先拿一下基本属性,略过 /* * 函数形式的写法: <a href="javascript:upYyzt(${o.oid},25,1)">取消</a> * 4种情况触发同一函数但是传递不同的type参数,写的蛮干净利落的; * / <td> <c:if test="${o.yyztid==21 }"> <a href="javascript:upYyzt(${o.oid},25,1)">取消</a> <a href="javascript:upYyzt(${o.oid},22,2)">付款</a> </c:if> <c:if test="${o.yyztid==22 }"> <a href="javascript:upYyzt(${o.oid },23,3)">取消</a> <a href="javascript:upYyzt(${o.oid },24,4)">完成</a> </c:if> <c:if test="${o.yyztid==24 }"> <a href="toComm?oid=${o.oid }">评论</a> </c:if> </td> </tr> </c:forEach> </c:if>
<script type="text/javascript"> // 更新预约状态函数 function upYyzt(oid,zt,type){ $.ajax({ url:"upYyzt", data:{"type":type,"oid":oid,"zt":zt}, type:"get", success:function(d){ if(d==1){ location.href="info.jsp"; } if(d==0 && type==3){ alert("取消预约失败,当天只能取消1次,一周只能取消2次"); } if(d==0 && type==1){ alert("作废失败"); } if(d==0 && type==2){ alert("付款失败"); } if(d==0 && type==4){ alert("操作失败"); } } }); } </script>
实现 :先不管事务方面的问题,这里主要记录mysql日期函数
这里的sql最终是这么写的:
yyztid为取消后的状态:23:已取消; udid :用户的唯一id ; oid 订单序号;rdate 下单时间
1 周一到周五已经取消的总次数:
select COUNT(OID) from h_order where udid=26 AND yyztid=23 and rdate >( subdate(rdate, date_format(RDATE,‘%w‘)-1)) and rdate >( subdate(rdate, date_format(RDATE,‘%w‘)-5));
2 当日取消次数:
select count(oid) from h_order where udid=26 and yyztid=23 and DATE_FORMAT(rdate,"%Y-%m-%d") = CURDATE() ;
sql:udid yyztid限定表的行的范围, 日期的> < 号可以直接表示在前在后,
? subdate 用来表示间隔,date_formate 修正格式 -1 -5 表示定位到周一和周五,
? DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。
? 需要注意的是 %M和%m表示的格式是不相同的,比如09月(m )和9月(M);附表末;
? 可以用add函数去取代subdate ,相应的-1 和-5也要改变;两者区别如下:
? DATE_SUB() 函数从日期减去指定的时间间隔。
? DATE_ADD() 函数向日期添加指定的时间间隔。
? rdate 本身是y-m-d-h-m-s格式,但是并不影响和y-m-d直接比较;
mysql:
后台代码:
在dao层中返回一个b到servelet ,servelet根据b返回值给ajax;
public int upOrderByType(int type, int oid, int zt,int udid) { int b = 0; String sql = null; if (type == 1 || type == 4) { sql = "update h_order set yyztid = ? where oid=? "; try { b = queryRunner.update(sql, zt, oid); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(type==3){ //周一到周五之间修改的条数 String sql1="select COUNT(OID) from h_order where udid=? AND yyztid=23\n" + "and rdate >( subdate(rdate, date_format(RDATE,‘%w‘)-1))\n" + "and rdate >( subdate(rdate, date_format(RDATE,‘%w‘)-5))\n" ; //当天修改的条数 String sql2="select count(oid) from h_order where udid=26 and yyztid=23 DATE_FORMAT(rdate,‘%Y-%m-%d‘) = CURDATE() "; //条件满足后要执行的sql; sql="update h_order set yyztid = ? where oid=?"; try { int m = queryRunner.query(sql1, new ScalarHandler<BigInteger>()).intValue(); int n = queryRunner.query(sql2, new ScalarHandler<BigInteger>()).intValue(); if(m<2 && n<1){ int update = queryRunner.update(sql, zt, oid); if(update>0){ b=1; } } } catch (SQLException throwables) { throwables.printStackTrace(); } } return b; }