导语:最近有一个需求是把销售订单的数据按年月周统计并展示出来,年月很好办,日期上就自带了,可是周就需要计算了,下面对于日期的属于某月的第几周进行了计算,提供了两周计算规则。
规则一:每月的一个号到周日都算作本月第一周,以此类推直到下月一号继续从第一周开始。
字段 | 描述 | |
---|---|---|
函数名称 | ZYH_WEEK_CAL | 根据日期计算所在月周 |
输入参数 | I_DATE | 日期 |
输出参数 | O_YEARS | 年 |
O_MONTH | 月 | |
O_WEEKS | 周 |
函数代码
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_DATE) TYPE SY-DATUM OPTIONAL
*" EXPORTING
*" VALUE(O_YEARS) TYPE CHAR4
*" VALUE(O_MONTH) TYPE CHAR2
*" VALUE(O_WEEKS) TYPE CHAR1
*"----------------------------------------------------------------------
DATA: lv_weeks TYPE scal-week.
DATA: lv_date TYPE sy-datum.
DATA: lv_weeks_y TYPE char2. "记录当前日期为本年的第几周
DATA: lv_weeks_m TYPE char2. "记录本月第一周为本年的第几周
IF i_date+4(2) = '01'. "如果是一月,直接用函数获取就可以
CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE'
EXPORTING
date = i_date
IMPORTING
week = lv_weeks.
o_weeks = lv_weeks+5(1).
o_years = i_date(4).
o_month = i_date+4(2).
ELSE.
CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE'
EXPORTING
date = i_date
IMPORTING
week = lv_weeks.
lv_weeks_y = lv_weeks+4(2). "获取到是本年的第几周
CLEAR lv_weeks.
lv_date = i_date(6) && '01'.
CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE'
EXPORTING
date = lv_date
IMPORTING
week = lv_weeks.
lv_weeks_m = lv_weeks+4(2).
o_weeks = lv_weeks_y - lv_weeks_m + 1.
o_years = i_date(4).
o_month = i_date+4(2).
ENDIF.
测试结果:
①20210501
②20210509
③20210531
规则二:如果输入日期所在月的1号不是周一,则将1号到周日都算做上个月的最后一周。
字段 | 描述 | |
---|---|---|
函数名称 | ZYH_WEEK_CAL1 | 根据日期计算所在月周 |
输入参数 | I_DATE | 日期 |
输出参数 | O_YEARS | 年 |
O_MONTH | 月 | |
O_WEEKS | 周 |
函数代码
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_DATE) TYPE SY-DATUM OPTIONAL
*" EXPORTING
*" VALUE(O_YEARS) TYPE CHAR4
*" VALUE(O_MONTH) TYPE CHAR2
*" VALUE(O_WEEKS) TYPE CHAR1
*"----------------------------------------------------------------------
DATA: lv_weeks_last TYPE char1.
DATA: lv_month_last TYPE char2.
DATA: lv_years_last TYPE char4.
DATA: lv_date TYPE sy-datum.
DATA: lv_date_01 TYPE sy-datum.
DATA: lv_date_31 TYPE sy-datum.
DATA : lv_wotnr TYPE p. "记录本月第一天是周几
DATA : lv_wotnr_last TYPE p. "记录本月第一天是周几
DATA : lv_days TYPE p. "记录本月几号为第一周
DATA : lv_days_last TYPE p. "记录本月几号为第一周
"获取上月最后一天是第几周
lv_date_31 = i_date(6) && '01'.
lv_date_31 = lv_date_31 - 1.
lv_date_01 = lv_date_31(6) && '01'.
lv_date = i_date(6) && '01'.
"获取上个月第一天是周几
CALL FUNCTION 'DAY_IN_WEEK'
EXPORTING
datum = lv_date_01
IMPORTING
wotnr = lv_wotnr_last.
"计算多少天后是周一,为本月第一周
lv_days_last = 7 - lv_wotnr_last + 1.
IF lv_days_last = 7. "如果七天后是周一,那么1号就是周一,就是本月第一周
lv_days_last = 0.
ENDIF.
DATA(lv_cal_last) = lv_date_31 - lv_date_01 - lv_days_last.
IF lv_cal_last >= 0 AND lv_cal_last < 7 .
lv_weeks_last = 1.
lv_month_last = lv_date_01+4(2).
lv_years_last = lv_date_01(4).
ELSEIF lv_cal_last >= 7 AND lv_cal_last < 14.
lv_weeks_last = 2.
lv_month_last = lv_date_01+4(2).
lv_years_last = lv_date_01(4).
ELSEIF lv_cal_last >= 14 AND lv_cal_last < 21.
lv_weeks_last = 3.
lv_month_last = lv_date_01+4(2).
lv_years_last = lv_date_01(4).
ELSEIF lv_cal_last >= 21 AND lv_cal_last < 28.
lv_weeks_last = 4.
lv_month_last = lv_date_01+4(2).
lv_years_last = lv_date_01(4).
ELSEIF lv_cal_last >= 28 AND lv_cal_last < 32.
lv_weeks_last = 5.
lv_month_last = lv_date_01+4(2).
lv_years_last = lv_date_01(4).
ENDIF.
"获取本个月第一天是周几
CALL FUNCTION 'DAY_IN_WEEK'
EXPORTING
datum = lv_date
IMPORTING
wotnr = lv_wotnr.
"计算多少天后是周一,为本月第一周
lv_days = 7 - lv_wotnr + 1.
IF lv_days = 7. "如果七天后是周一,那么1号就是周一,就是本月第一周
lv_days = 0.
ENDIF.
DATA(lv_cal) = i_date - lv_date - lv_days.
IF lv_cal >= 0 AND lv_cal < 7 .
o_weeks = 1.
o_years = i_date(4).
o_month = i_date+4(2).
ELSEIF lv_cal >= 7 AND lv_cal < 14.
o_weeks = 2.
o_years = i_date(4).
o_month = i_date+4(2).
ELSEIF lv_cal >= 14 AND lv_cal < 21.
o_weeks = 3.
o_years = i_date(4).
o_month = i_date+4(2).
ELSEIF lv_cal >= 21 AND lv_cal < 28.
o_weeks = 4.
o_years = i_date(4).
o_month = i_date+4(2).
ELSEIF lv_cal >= 28 AND lv_cal < 32.
o_weeks = 5.
o_years = i_date(4).
o_month = i_date+4(2).
ELSE.
o_weeks = lv_weeks_last .
o_years = lv_years_last .
o_month = lv_month_last .
ENDIF.
测试结果:
①20210501
②20210509
③20210531
④20210101
作者:小飞猪猪猪猪猪猪猪–CSDN