计算日期间隔,以XX年XX月XX日格式显示
一個報表中用戶提出了這樣的需求, 與其花時間找標準函數(還不知道有沒有),不如干脆自己寫一個,代碼如下:
?
&---------------------------------------------------------------------*
*&??????Form??getdate
*&---------------------------------------------------------------------*
*??以當前日期為準,計算月間隔日期
*----------------------------------------------------------------------*
FORM?culc_date?USING??p_diff_m
?????????????????? CHANGING?p_v_date.
??DATA:v_year_n(4)?TYPE?n,
?????????? v_year_c(4)?TYPE?c,
???????? ? v_month_n(2)?TYPE?n,
?????????? v_month_c(2)?TYPE?c,
?????????? v_day_n(2)?TYPE?n,
?????????? v_day_c(2)?TYPE?c,
?????????? v_date_c(8)?TYPE?c,
?????????? v_mod1?TYPE?i,
?????????? v_mod2?TYPE?i,
?????????? v_mod3?TYPE?i.
??v_month_c?=?sy-datum+4(2).
??v_month_n?=?v_month_c.
??v_year_c?=?sy-datum+0(4).
??v_year_n?=?v_year_c.
??v_day_c?=?sy-datum+6(2).
??v_month_n?=?v_month_n?-?p_diff_m.
??IF?v_month_n?<=?0.
????v_month_n?=?v_month_n?+?12?+?p_diff_m?-?1.
????v_year_n?=?v_year_n?-?1.
??ENDIF.
??CASE?v_month_n?.
????WHEN?4?OR?6?OR??9?OR?11.
??????IF?v_day_n?=?31.
????????v_day_n?=?30.
??????ENDIF.
????WHEN?2.
??????v_mod1?=?v_year_n?MOD??4.
??????v_mod2?=?v_year_n?MOD?400.
??????v_mod3?=?v_year_n?MOD?100.
??????IF?(?(?v_mod1?=?0?)?OR?(?v_mod2?=?0?)?)?AND?(?v_mod3?<>?0?).
????????IF?(?v_day_n?>?29?).
??????????v_day_n?=?29.
????????ENDIF.
??????ELSE.
????????IF?(?v_day_n?>?28?).
??????????v_day_n?=?28.
????????ENDIF.
??????ENDIF.
??ENDCASE.
??v_year_c?=?v_year_n.
??v_month_c?=?v_month_n.
??CONCATENATE?v_year_c?v_month_c?v_day_c?INTO?v_date_c.
??p_v_date?=?v_date_c.
ENDFORM.????????????????????"?getdate
*&---------------------------------------------------------------------*
*&??????Form??calc_shlf
*&---------------------------------------------------------------------*
*???????計算當前庫齡
*----------------------------------------------------------------------*
*??????-->P_WA_RESULT_BUDAT??text
*----------------------------------------------------------------------*
FORM?calc_shlf??USING????p_budat??"報產日期
????????????????CHANGING?p_shlf.?"庫齡
??DATA:v_year_n_sy?TYPE?i,
???????v_year_n?TYPE?i,
???????v_year_c(4)?TYPE?c,
???????v_month_n_sy?TYPE?i,
???????v_month_n?TYPE?i,
???????v_month_c(2)?TYPE?c,
???????v_day_n_sy?TYPE?i,
???????v_day_n?TYPE?i,
???????v_day_c(2)?TYPE?c,
???????v_year_diff?TYPE?i,
???????v_month_diff?TYPE?i,
???????v_day_diff?TYPE?i,
???????v_mod_4?TYPE?i,
???????v_mod_100?TYPE?i,
???????v_mod_400?TYPE?i.
??v_year_n_sy?=?sy-datum+0(4).??"?current?year
??v_month_n_sy?=?sy-datum+4(2).?"?current?month
??v_day_n_sy?=?sy-datum+6(2).???"?current?day
??v_year_n?=?p_budat+0(4).
??v_month_n?=?p_budat+4(2).
??v_day_n?=?p_budat+6(2).
??v_day_diff?=?sy-datum?-?p_budat.
??IF?(?v_day_diff?>?365?)?.
????v_year_diff?=?v_day_diff?/?365.?"?取模
??ENDIF.
??IF?(?v_month_n_sy?<?v_month_n?).
????v_month_diff?=?v_month_n_sy?+?12?-?v_month_n.
??ELSE.
????v_month_diff?=?v_month_n_sy?-?v_month_n.
??ENDIF.
??v_day_diff?=?v_day_n_sy?-?v_day_n.
??IF?(?v_day_diff?<?0?).
????v_month_diff?=?v_month_diff?-?1.
??ENDIF.
??CASE?v_month_n.
????WHEN?4?OR?6?OR??9?OR?11.????????????????????????????????"?30?days
??????PERFORM?calc_day_diff?USING?30?v_day_diff
???????????????????????????????? ? ? ? ? ? ? ? ? ? ?? v_day_n?v_day_n_sy
????????????????????????????????? CHANGING?v_day_diff.
????WHEN?1?OR?3?OR?5?OR?7?OR?8?OR?10?OR?12?.?? "?31?days
??????PERFORM?calc_day_diff?USING?31?v_day_diff
?????????????????????????????????????????????????????? v_day_n?v_day_n_sy
????????????????????????????????? CHANGING?v_day_diff.
????WHEN?2.??????????????????????????????????????"?28?or?29?days
??????v_mod_4???? =?v_year_n?MOD??4.
??????v_mod_400?=?v_year_n?MOD?400.
??????v_mod_100?=?v_year_n?MOD?100.
??????IF?(?(?v_mod_4?=?0?)?OR?(?v_mod_400?=?0?)?)?AND?(?v_mod_400?<>?0?).
????????PERFORM?calc_day_diff?USING?29?v_day_diff
???????????????????????????????????????????????????????? v_day_n?v_day_n_sy
???????????????????????????? ? ? ?? CHANGING?v_day_diff.
??????ELSE.
????????PERFORM?calc_day_diff?USING?28?v_day_diff
?????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? v_day_n?v_day_n_sy
???????????????????????????? ? ? ?? CHANGING?v_day_diff.
??????ENDIF.
??ENDCASE.
??p_shlf?=?space.
??IF?(?v_year_diff?>?0?).
????v_year_c?=?v_year_diff.
????CONCATENATE?v_year_c?'年'??INTO??p_shlf.
??ENDIF.
??IF?(?v_month_diff?>?0?).
????v_month_c?=?v_month_diff.
????CONCATENATE?p_shlf?v_month_c??'月'??INTO??p_shlf.
??ENDIF.
??IF?(?v_day_diff?>=?0?).
????v_day_c?=?v_day_diff.
????CONCATENATE?p_shlf?v_day_c??'天'??INTO??p_shlf.
??ENDIF.
ENDFORM.????????????????????"2?calc_shlf
*&---------------------------------------------------------------------*
*&??????Form??calc_day_diff
*&---------------------------------------------------------------------*
*???????計算間隔日期
*----------------------------------------------------------------------*
FORM?calc_day_diff??USING??p_days_per_month
???????????????????????????????????????????? p_day_diff_value
????????????????????????? ? ? ? ? ? ? ? ? ?? p_day_n
????????????????????????? ? ? ? ? ? ? ? ? ?? p_day_n_sy
??????????????????????? CHANGING?p_day_diff.
??IF?(??p_day_diff_value?<?0?).
????p_day_diff?=?p_days_per_month??-?p_day_n?+?p_day_n_sy.
??ELSE.
????IF?(?p_day_n_sy?>?p_days_per_month??).
??????p_day_diff?=?p_days_per_month?-?p_day_n.
????ELSE.
??????p_day_diff?=?p_day_n_sy?-?p_day_n.
????ENDIF.
??ENDIF.
ENDFORM.????????????????????"?calc_day_diff
總結
以上是生活随笔為你收集整理的计算日期间隔,以XX年XX月XX日格式显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分式加法JAVA程序_分式加减运算的八种
- 下一篇: Quixel bridge桥接设置