有一款金融產品,總共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進行整理,待續!!!