【问题标题】:mysql Event running yearly calculationsmysql 事件运行年度计算
【发布时间】:2012-04-10 12:37:34
【问题描述】:

我有以下代码

CREATE EVENT myevent2
ON SCHEDULE EVERY '1' YEAR
STARTS commit_date + INTERVAL 1 YEAR
DO
UPDATE lms.loan 



        if new.app_loan_type='Computer Loan' then 
    SET NEW.app_yearly_intrst = (NEW.app_ln_amnt *(NEW.computer_interest/100));
    end if;


    if new.app_loan_type="Miscellaneous Loan" then 
    SET NEW.app_yearly_intrst = (NEW.app_ln_amnt *(NEW.miscellaneous_interest/100));
    end if;

    if new.app_loan_type="Motor Vehicle Loan" then 
    SET NEW.app_yearly_intrst = (NEW.app_ln_amnt *(NEW.motor_vehicle_interest/100));
    end if;

    if new.app_loan_type="Motor Vehicle Insurance Loan" then 
    SET NEW.app_yearly_intrst = (NEW.app_ln_amnt *(NEW.mv_insurance_interest/100));
    end if;

    if new.app_loan_type="Motor Vehicle Repair Loan" then 
    SET NEW.app_yearly_intrst = (NEW.app_ln_amnt *(NEW.mv_repair_interest/100));
    end if;


    if new.app_loan_type="Salary Advance Loan" then 
    SET NEW.app_yearly_intrst = (NEW.app_ln_amnt *(NEW.salary_advance_interest/100));
    end if;


    if new.app_loan_type="Tertiary Loan" then 
    SET NEW.app_yearly_intrst = (NEW.app_ln_amnt *(NEW.tertiary_interest/100));
    end if;

    SET NEW.app_mnthly_intrest = (NEW.app_yearly_intrst/12);
    SET NEW.app_quarterly_intrest = (NEW.app_mnthly_intrest * 3);
    SET NEW.app_amnt_owed = (NEW.app_ln_amnt+ NEW.app_yearly_intrst);

  END$$

我正在尝试创建一个事件来计算两种贷款类型的利息:“计算机贷款”和“杂项贷款”等,每年一次,但是每年一次取决于 commit_date 列从 commit_date 列开始的一年,然后如果 app_loan_type 是“计算机贷款”或“杂项贷款”,则计算年利息我还计算月利息、季度利息和欠款总额,但我的主要问题是如何设置间隔commit_date 和当前日期为 1 年

【问题讨论】:

    标签: mysql sql events


    【解决方案1】:

    我不确定您是否可以在 STARTS 子句中使用列值,但有一个解决方法,您可以每天安排此事件并在 all 中进行额外检查你有IF 子句,检查commit_datecurrent_date() 之间的日期差是一年。

    类似:

    if new.app_loan_type="Salary Advance Loan" and DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), commit_date)), "%Y")+0 = 1 then
    

    【讨论】:

    • 所以您是说上面@jeffery_the_wind 的答案行不通?
    • 我在@jeffery_the_wind 的答案中收到以下错误,我试图找到错误,但它给了我一个温暖的时间,请如果我可以再次寻求帮助#1064 - 你有一个错误在您的 SQL 语法中;检查与您的 MySQL 服务器版本相对应的手册,以在第 7 行的 'if datediff(date(now()),commit_date) >= 365 then if new.app_loan_type="' 附近使用正确的语法
    【解决方案2】:

    我认为您不能为创建事件语法中使用的timestamp 使用动态值。而是每天运行您的事件,您可以在事件的更新查询的 where 子句中使用 datediff 函数来检查应该更新哪些数据。你也可以像这样检查确切的日期:where day(now()) = day(commit_date) and month(now()) = month(commit_date) and year(now()) = year(commit_date) + 1;,但在leap eyar的情况下你不会更新,所以你应该使用这样的东西:

    delimiter ||
    
    CREATE EVENT myevent2
    ON SCHEDULE EVERY 1 DAY
    STARTS now()
    DO
        UPDATE lms.loan SET app_yearly_intrst = (app_ln_amnt *(computer_interest/100)) where app_loan_type = 'Computer Loan' and datediff(date(now()),commit_date) >= 365;
        UPDATE lms.loan SET app_yearly_intrst = (app_ln_amnt *(miscellaneous_interest/100)) where app_loan_type = 'Miscellaneous Loan' and datediff(date(now()),commit_date) >= 365;
        UPDATE lms.loan SET app_yearly_intrst = (app_ln_amnt *(motor_vehicle_interest/100)) where app_loan_type = 'Motor Vehicle Loan' and datediff(date(now()),commit_date) >= 365;
        UPDATE lms.loan SET app_yearly_intrst = (app_ln_amnt *(mv_insurance_interest/100)) where app_loan_type = 'Motor Vehicle Insurance Loan' and datediff(date(now()),commit_date) >= 365;
        UPDATE lms.loan SET app_yearly_intrst = (app_ln_amnt *(mv_repair_interest/100)) where app_loan_type = 'Motor Vehicle Repair Loan' and datediff(date(now()),commit_date) >= 365;
        UPDATE lms.loan SET app_yearly_intrst = (app_ln_amnt *(salary_advance_interest/100)) where app_loan_type = 'Salary Advance Loan' and datediff(date(now()),commit_date) >= 365;
        UPDATE lms.loan SET app_yearly_intrst = (app_ln_amnt *(tertiary_interest/100)) where app_loan_type = 'Tertiary Loan' and datediff(date(now()),commit_date) >= 365;
        UPDATE lms.loan SET app_mnthly_intrest = (app_yearly_intrst/12), app_quarterly_intrest = (NEW.app_mnthly_intrest * 3), app_amnt_owed = (app_ln_amnt+ app_yearly_intrst) where datediff(date(now()),commit_date) >= 365;
    END||
    

    【讨论】:

    • 我收到以下错误,我试图找到错误,但它给了我一个温暖的时间,请如果我可以再次寻求帮助#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 7 行的 'if datediff(date(now()),commit_date) >= 365 then if new.app_loan_type="' 附近使用正确的语法
    • @dames - 抱歉更新需要在 if 语句中,请再次检查我的答案。
    • @dames - 我再次意识到 if ... then 不是必需的,您应该在更新语法的 WHERE 子句中添加条件。请查看上面的新创建事件语法,如果它有效,请告诉我。
    • 起初我遇到了一个错误,所以我不得不删除分隔符 $$ 和 End$$...现在我收到以下错误:SQL 查询:UPDATE lms.loan SET app_yearly_intrst = ( app_ln_amnt * ( miscellaneous_interest /100 ) ) WHERE app_loan_type = 'Miscellaneous Loan' AND datadiff( date( now( ) ) , commit_date ) >=365; MySQL 说:文档 #1305 - FUNCTION lms.datadiff 不存在
    • @dames -- 哎呀,应该是 datediff,不是 datadiff,我会在上面改一下
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多