ABAP日期处理函数

  *&---------------------------------------------------------------------*
*& Report  ZQWE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZQWE.

DATA: DATE1 LIKE SY-DATUM,
      DATE2 LIKE SY-DATUM,
      DATE3 LIKE SY-DATUM,
      DATE4 LIKE SY-DATUM,
      DATE5 LIKE SY-DATUM,
      DATE6 LIKE SY-DATUM,
      DATE7 LIKE SY-DATUM.

DATA: WEEK1 LIKE SCAL-WEEK,
      WEEK2 LIKE SCAL-WEEK.

DATA: DAYS TYPE I.

DATA: SUND TYPE  P.

  DATA: DATE_L LIKE SY-DATUM,
        TIME_L LIKE SY-UZEIT.

PARAMETERS: GJAHR TYPE GJAHR OBLIGATORY,
                       MONAT TYPE MONAT OBLIGATORY,
                       TIME LIKE SY-UZEIT.

"搜索帮助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR GJAHR.
  CALL FUNCTION 'F4_DATE'
   EXPORTING
     DATE_FOR_FIRST_MONTH               = SY-DATUM
   IMPORTING
     SELECT_DATE                        =  DATE_L
   EXCEPTIONS
     CALENDAR_BUFFER_NOT_LOADABLE       = 1
     DATE_AFTER_RANGE                   = 2
     DATE_BEFORE_RANGE                  = 3
     DATE_INVALID                       = 4
     FACTORY_CALENDAR_NOT_FOUND         = 5
     HOLIDAY_CALENDAR_NOT_FOUND         = 6
     PARAMETER_CONFLICT                 = 7
     OTHERS                             = 8
            .
  IF SY-SUBRC = 0.
    GJAHR = DATE_L+0(4).
  ENDIF.

START-OF-SELECTION.

  "某个月第一天
  CONCATENATE GJAHR MONAT '01' INTO DATE1.

  "某个月最后一天
  CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
    EXPORTING
      DAY_IN            = DATE1
    IMPORTING
      LAST_DAY_OF_MONTH = DATE2
    EXCEPTIONS
      DAY_IN_NO_DATE    = 1
      OTHERS            = 2.

  "两个日期之间的天数
  DAYS = DATE2 - DATE1.

  "年度,月份,天数,往前往后推
  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' "从当前的日期往前推3个月得到一个日期
  EXPORTING
    DATE            = DATE2
    DAYS            = 0
    MONTHS          = 1
    SIGNUM          = '+'
    YEARS           = 0
  IMPORTING
    CALC_DATE       = DATE3.

  "根据日期获取到周数
  CALL FUNCTION 'DATE_GET_WEEK'
    EXPORTING
      DATE         = DATE3
    IMPORTING
      WEEK         = WEEK1
    EXCEPTIONS
      DATE_INVALID = 1
      OTHERS       = 2.

  "获取该周第一天
  CALL FUNCTION 'WEEK_GET_FIRST_DAY'
    EXPORTING
      WEEK         = WEEK1
    IMPORTING
      DATE         = DATE4
    EXCEPTIONS
      WEEK_INVALID = 1
      OTHERS       = 2.

  "根据周数,获取下一周周数,星期一与星期天
  CALL FUNCTION 'NEXT_WEEK'
    EXPORTING
      CURRENT_WEEK       =  WEEK1
   IMPORTING
     NEXT_WEEK          = WEEK2
     MONDAY             =  DATE5
     SUNDAY             =     DATE6      .

"根据日期获取星期几
"返回为数字,数字与星期X或者monday之类对应关系TABLES: T246.
CALL FUNCTION 'DAY_IN_WEEK'
  EXPORTING
    DATUM         = DATE4
 IMPORTING
   WOTNR         =      SUND     .

WRITE:/ DATE1, DATE2, DAYS, DATE3, WEEK1, DATE4, SUND, WEEK2, DATE5, DATE6.


将日期由内部格式转换成外部格式,比如'20121020'转换成'2012.10.20',BDC的时候可能用到

CONVERT_DATE_TO_EXTERNAL

将日期由外部格式转成内部格式,从屏幕取值的时候可能用到

CONVERT_DATE_TO_INTERNAL 

### ABAP 中常用的日期处理函数 #### 获取最后工作日 为了获得特定工厂日历下的最后一个工作日,`LAST_FACTORYDATE_GET` 函数模块被调用。此功能返回给定工厂日历中的最近的工作日[^1]。 ```abap DATA: lv_last_workday TYPE d. CALL FUNCTION 'LAST_FACTORYDATE_GET' EXPORTING factory_calendar_type = 'GREGORIAN' " 或其他类型的工厂日历 IMPORTING last_factory_date = lv_last_workday. ``` #### 构建日期范围条件 当构建一个日期区间的选择条件时,可以通过设置 `so_date-sign`, `so_date-option` 和附到内表来实现。这通常用于筛选数据记录的时间跨度[^2]。 ```abap TYPES: BEGIN OF ty_date_range, sign TYPE c LENGTH 1, option TYPE c LENGTH 2, low TYPE d, high TYPE d, END OF ty_date_range. DATA: lt_date_range TYPE TABLE OF ty_date_range, ls_date_range LIKE LINE OF lt_date_range. ls_date_range-sign = 'I'. ls_date_range-option = 'BT'. ls_date_range-low = '20230101'. ls_date_range-high = '20231231'. APPEND ls_date_range TO lt_date_range. ``` #### 执行日期运算 对于执行基于一定间隔的日期计算(比如增或减少天数、份数或是年数),可以利用 `RP_CALC_DATE_IN_INTERVAL` 函数模块完成这样的操作。该函数允许指定正负号来进行增减,并最终导出经过调整后的日期值[^3]。 ```abap DATA: lv_new_date TYPE sy-datum. CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = sy-datum days = 7 months = 0 signum = '+' years = 0 IMPORTING calc_date = lv_new_date. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值