1. 程式人生 > 其它 >mysql 日期函式 應該會比較耐用

mysql 日期函式 應該會比較耐用

date_sub formate

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