mysql5.7.18存储过程跨日处理的问题

发布于 2022-09-06 20:40:51 字数 2274 浏览 15 评论 0

  1. 需求:(周四、周五)凌晨处理3天前数据,(周一、周二、周三)凌晨处理5天前数据,周六周日不处理;
  2. 请问如何修改下列存储过程?
 /* 
    Mysql5.7.18
 */

CREATE PROCEDURE increase_available()
p:
begin -- 开始存储过程  
declare current_product_code varchar(32); -- 产品代码  
declare current_userid INT(11); -- 用户ID  
declare current_verify_time INT(11); -- 审核时间
declare current_amount INT(11); -- 交易数量 
declare handle_day INT(11); -- 处理日
declare handle_day_before INT(11); -- 处理日(前一天)

-- 交易审核的起始时间:三天前
-- start_date = unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL -3 DAY));  
-- 交易审核的结束时间:二天前
-- end_date = unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL -2 DAY));

DECLARE done INT DEFAULT FALSE; -- 自定义控制游标循环,默认false  

-- 按T+3日处理,周六、周日不处理。
-- 当前周四处理周一的数据,
if DAYOFWEEK(CURDATE()) = 5 then 
    set @handle_day = 3, @handle_day_before = 2;
-- 当前周五处理周二的数据
elseif DAYOFWEEK(CURDATE()) = 6 then 
    set @handle_day = 3, @handle_day_before = 2;
-- 当前下周一处理上周三的数据
elseif DAYOFWEEK(CURDATE()) = 2 then 
    set @handle_day = 5, @handle_day_before = 4;
-- 当前下周二处理上周四的数据
elseif DAYOFWEEK(CURDATE()) = 3 then 
    set @handle_day = 5, @handle_day_before = 4;
-- 当前下周三处理上周五的数据
elseif DAYOFWEEK(CURDATE()) = 4 then 
    set @handle_day = 5, @handle_day_before = 4;
else 
    -- 周六、周日不处理,不执行存储过程
    LEAVE p;
end if;  

DECLARE My_Cursor CURSOR FOR ( SELECT product_code, userid, amount, verify_time FROM oa_option_transactions WHERE type= 1 and `status`=2 and verify_time >= unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL - @handle_day DAY)) and verify_time < unix_timestamp(DATE_ADD(date(CURDATE()),INTERVAL - @handle_day_before DAY)) ); -- 定义游标并输入结果集  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 绑定控制到游标,游标循环结束自动转true  

OPEN My_Cursor; -- 打开游标  
  myLoop: LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到  
    FETCH My_Cursor into current_product_code, current_userid, ,current_amount, current_verify_time; -- 将游标当前读取行的数据顺序赋予自定义 
    IF done THEN -- 判断是否继续循环  
      LEAVE myLoop; -- 结束循环  
    END IF;  
    -- 自己要做的事情,在 sql 中直接使用自定义即可  

        UPDATE oa_option_holdings SET available = available + current_amount WHERE product_code = current_product_code and user_id = current_userid; --   

    COMMIT; -- 提交事务  
  END LOOP myLoop; -- 结束自定义循环体  
  CLOSE My_Cursor; -- 关闭游标  
END

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文