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 days
WRITE lv_date.
lv_date = sy-datum - 5. " Subtracts 5 days
WRITE lv_date.

2. Adding/Subtracting Months

Since months have variable lengths, direct arithmetic won’t work. Instead, use function modules or classes.

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, 2024
lv_date2 = '20240201'. " February 1, 2024
lv_diff = lv_date1 - lv_date2. " Difference in days
WRITE: '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 01
WRITE: '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

TaskMethod
Add/Subtract Dayssy-datum + N
Add/Subtract MonthsSCAL=>add_to_date, RP_CALC_DATE_IN_INTERVAL
Add/Subtract YearsSCAL=>add_to_date, RP_CALC_DATE_IN_INTERVAL
Date Differencedate1 - date2
Get WeekdayDATE_GET_WEEKDAY
Format DateWRITE ... TO ...
Validate DateDATE_CHECK_PLAUSIBILITY
End of MonthLAST_DAY_IN_PERIOD_GET
First Day of Monthsy-datum - sy-datum+6
Current TimestampSYST_TIMESTAMP_GET