SAP ABAP Date Calculations
SAP ABAP provides various ways to perform date calculations, including adding/subtracting days, months, or years, calculating differences, and formatting dates.
1. Adding/Subtracting Days
You can directly add or subtract days using simple arithmetic.
DATA: lv_date TYPE sy-datum.
lv_date = sy-datum + 10. " Adds 10 daysWRITE lv_date.
lv_date = sy-datum - 5. " Subtracts 5 daysWRITE lv_date.
2. Adding/Subtracting Months
Since months have variable lengths, direct arithmetic won’t work. Instead, use function modules or classes.
Using SCAL
Class (Recommended)
DATA: lv_date TYPE sy-datum, lv_newdate TYPE sy-datum.
lv_date = sy-datum.
lv_newdate = cl_abap_datfm=>add_to_date( i_date = lv_date, i_months = 2 ). " Add 2 months
WRITE lv_newdate.
Using RP_CALC_DATE_IN_INTERVAL
Function Module
DATA: lv_date TYPE sy-datum, lv_newdate TYPE sy-datum.
lv_date = sy-datum.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = lv_date months = 2 " Add 2 months signum = '+' IMPORTING calc_date = lv_newdate.
WRITE lv_newdate.
3. Adding/Subtracting Years
Using the same methods as above:
lv_newdate = cl_abap_datfm=>add_to_date( i_date = lv_date, i_years = 1 ). " Adds 1 year
or using RP_CALC_DATE_IN_INTERVAL
:
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = lv_date years = 1 signum = '+' IMPORTING calc_date = lv_newdate.
4. Calculating Date Difference (Days Between Two Dates)
DATA: lv_date1 TYPE sy-datum, lv_date2 TYPE sy-datum, lv_diff TYPE i.
lv_date1 = '20240301'. " March 1, 2024lv_date2 = '20240201'. " February 1, 2024
lv_diff = lv_date1 - lv_date2. " Difference in daysWRITE: 'Difference:', lv_diff.
✅ Works with standard date format
✅ Returns positive or negative values depending on date order
5. Checking Weekday Name
DATA: lv_weekday TYPE char10.
CALL FUNCTION 'DATE_GET_WEEKDAY' EXPORTING date = sy-datum IMPORTING weekday = lv_weekday.
WRITE: 'Today is:', lv_weekday.
✅ Returns weekday (1 = Monday, 7 = Sunday)
6. Converting Date Formats
DATA: lv_date TYPE sy-datum, lv_date_txt TYPE char10.
lv_date = sy-datum.WRITE lv_date TO lv_date_txt DD/MM/YYYY.
WRITE: 'Formatted date:', lv_date_txt.
✅ Converts YYYYMMDD → DD/MM/YYYY format
7. Checking if a Date is Valid
DATA: lv_valid TYPE abap_bool.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY' EXPORTING date = '20240230' " Invalid date (Feb 30) IMPORTING result = lv_valid.
IF lv_valid = abap_true. WRITE: 'Valid date'.ELSE. WRITE: 'Invalid date'.ENDIF.
✅ Prevents invalid date processing errors
8. Calculating End of the Month
DATA: lv_date TYPE sy-datum, lv_enddate TYPE sy-datum.
lv_date = sy-datum.
CALL FUNCTION 'LAST_DAY_IN_PERIOD_GET' EXPORTING i_date = lv_date IMPORTING e_date = lv_enddate.
WRITE: 'End of month:', lv_enddate.
✅ Finds the last day of the given month
9. Getting the First Day of the Month
DATA: lv_first_day TYPE sy-datum.
lv_first_day = sy-datum - sy-datum+6. " Sets day to 01WRITE: 'First day:', lv_first_day.
✅ Quick way to get the first day of the current month
10. Getting the Current System Timestamp
DATA: lv_timestamp TYPE timestamp.
CALL FUNCTION 'SYST_TIMESTAMP_GET' IMPORTING syst_timestamp = lv_timestamp.
WRITE: 'Current timestamp:', lv_timestamp.
✅ Useful for logging and real-time processing
Summary of Key Methods
Task | Method |
---|---|
Add/Subtract Days | sy-datum + N |
Add/Subtract Months | SCAL=>add_to_date , RP_CALC_DATE_IN_INTERVAL |
Add/Subtract Years | SCAL=>add_to_date , RP_CALC_DATE_IN_INTERVAL |
Date Difference | date1 - date2 |
Get Weekday | DATE_GET_WEEKDAY |
Format Date | WRITE ... TO ... |
Validate Date | DATE_CHECK_PLAUSIBILITY |
End of Month | LAST_DAY_IN_PERIOD_GET |
First Day of Month | sy-datum - sy-datum+6 |
Current Timestamp | SYST_TIMESTAMP_GET |