计算日期所在年月周【函数】

导语:最近有一个需求是把销售订单的数据按年月周统计并展示出来,年月很好办,日期上就自带了,可是周就需要计算了,下面对于日期的属于某月的第几周进行了计算,提供了两周计算规则。

规则一:每月的一个号到周日都算作本月第一周,以此类推直到下月一号继续从第一周开始。
在这里插入图片描述

字段描述
函数名称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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞猪猪猪猪猪猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值