有一款金融产品,总共24期,每月2日到期还款日,第一个到期还款日为放款日下个月的2日,现在我们知道所有订单的放款时间,现在我们想统计每个订单当前时间是第几期。
举个简单例子:当期日期为2019-11-12,假设某个订单的放款日期为2019-09-13,那么这个订单当前就处于第2期。现在通过上篇文章的mysql时间日期函数统计相关数据。
分析:总共10笔订单,有三个类型的账单日prov_stg_day2、12、13。首先用账单日对比当期日期,当前日期大于等于账单日,当前期数cur_term加1;actual是预期值(用于判断sql语句查出来的是否正确);
一、 已过到期还款日
select id,acp_dt,now(),prov_stg_day,actual,TIMESTAMPDIFF(MONTH,acp_dt,now()) as cur_term
from hb_loanfile_detail where day(now())>prov_stg_day;
查询结果:有些cur_term计算错误,是由于TIMESTAMPDIFF函数计算:不足月是舍弃的,但实际我们只要隔月了就算一个月
所以我们可以对acp_dt进行处理:DATE_FORMAT(acp_dt,'%Y-%m-01')
select id,acp_dt,prov_stg_day,actual,TIMESTAMPDIFF(MONTH,DATE_FORMAT(acp_dt,'%Y-%m-01'),now())
as cur_term from hb_loanfile_detail where day(now())>prov_stg_day;
二、 未过到期还款日
select id,acp_dt,prov_stg_day,actual,TIMESTAMPDIFF(MONTH,DATE_FORMAT(acp_dt,'%Y-%m-01'),now())
as cur_term from hb_loanfile_detail where day(now())<=prov_stg_day;
用相同的方法发现查询的cur_term是错的,所以我们要转换一下思路:
应该对now()进行处理:DATE_SUB(now(),interval 1 month)
select id,acp_dt,prov_stg_day,actual,TIMESTAMPDIFF(MONTH,DATE_FORMAT(acp_dt,'%Y-%m-01'),DATE_SUB(now(),interval 1 month))
as cur_term from hb_loanfile_detail where day(now())<=prov_stg_day;
所以最终两个sql语句如下:
-- 已过到期还款日
select id,acp_dt,now(),prov_stg_day,actual,TIMESTAMPDIFF(MONTH,DATE_FORMAT(acp_dt,'%Y-%m-01'),now())
as cur_term from hb_loanfile_detail where day(now())>prov_stg_day;
-- 未过或正好到期还款日
select id,acp_dt,now(),prov_stg_day,actual,TIMESTAMPDIFF(MONTH,DATE_FORMAT(acp_dt,'%Y-%m-01'),DATE_SUB(now(),interval 1 month))
as cur_term from hb_loanfile_detail where day(now())<=prov_stg_day;
后面将介绍 case when then 语句对上面两个sql进行整理,待续!!!