【數據庫】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進行整理,待續!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章