mysql 日期函数 应该会比较耐用

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

mysql  日期函数 应该会比较耐用

mysql 日期函数 应该会比较耐用

上一篇:MySQL数据库基础


下一篇:JDBC