【数据库】Mysql日期/时间函数实际案例

有一款金融产品,总共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进行整理,待续!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值