如何在ABAP CDS中计算前一天日期?
解决方案:ABAP中获取前一天日期
$session.system_date返回的是DATS类型(8位字符格式日期,YYYYMMDD),这类日期类型不能直接做算术减法,必须用ABAP提供的日期处理工具来计算前一天,以下是两种常用场景的解决方案:
场景1:在ABAP CDS视图中使用
使用内置函数SHIFT_DATE来偏移日期,语法简单直接:
define view ZV_DATE_CALC as select from dummy { $session.system_date as today, shift_date($session.system_date, -1, 'D') as yesterday }
shift_date参数说明:第一个参数为源日期,第二个参数为偏移天数(负数表示往前推),第三个参数'D'表示单位为天。
场景2:在普通ABAP程序中使用
有两种常用方式:
方式一:使用日期工具类方法
DATA: lv_today TYPE dats, lv_yesterday TYPE dats. lv_today = $session->system_date. " 或直接使用系统变量 sy-datum lv_yesterday = cl_abap_date_utilities=>add_days( date = lv_today days = -1 ). WRITE: / '今日日期:', lv_today, / '昨日日期:', lv_yesterday.
方式二:直接使用SUBTRACT语句
ABAP对DATS类型支持直接的日期增减语句:
DATA: lv_today TYPE dats, lv_yesterday TYPE dats. lv_today = $session->system_date. lv_yesterday = lv_today. SUBTRACT 1 FROM lv_yesterday. " 自动处理跨月、跨年的日期逻辑 WRITE: / lv_today, lv_yesterday.
注意事项
直接用$session.system_date - 1报错的原因是:DATS类型本质是字符型,并非数值类型,算术减法会触发类型不兼容错误,必须通过专门的日期处理函数/语句来操作,它们会自动处理诸如月末、年末的边界情况(比如1月1日的前一天是上一年的12月31日)。
内容的提问来源于stack exchange,提问作者KLM
相关产品推荐
相关产品推荐

