
作者:扯蛋君
整理:齐天大圣
声明:本文章仅用于SAP软件的应用、学习沟通,不代表SAP公司;文中所示截图来源SAP软件,相应著作权归SAP所有。
在SAP软件系统的前端界面,我们可能会看到一个字段的值是空的。其实,用鼠标点击是能发现是NULL值,还是空格符的。如图某设备的台账中WBS元素为空:

但是,这里跟底层数据库中存储的值可能会存在一定的差异,这种差异化会在数据流转,尤其使用ETL工具(Kettle、Informatic等)从SAP的数据库将数据抽取到其他数据库如MySQL、PostgreSQL等,会造成数据的差异化,这种差异化可能会影响数据质量治理的效果。
那么,我们表象上理解的“空值”,在SAP数据库中到底存储的是什么呢?这里以Oracle为例进行描述。通过查询上图设备的WBS元素在数据中显示:

我们发现SAP ERP前端字段显示为空,后台数据库中经常会看到“00000000”等表示,而不是直接用NULL或空格呢?其实,这种“00000000”的值是ABAP日期的初始值,也就是数据库在定义字段的时候,是初始默认为“00000000”值的。
我们知道HANA数据中日期数据类型的默认格式是YYYY-MM-DD,而在原有ECC+Oracle中日期数据类型YYYYMMDD,我想在做数据迁移的时应该会遇到这样的问题:就是需要使用SQL脚本将ABAP日期转换为HANA日期,并在空日期上保留空值。
那么,通过SQL脚本将ABAP样式日期(即表示为字符串“ 20200811”的2020-08-11)转换为HANA日期。可以通过以下SQL轻松搞定:
select to_date('20171120','YYYYMMDD') from chedan
如果ABAP日期是初始的(值'00000000'),则数据库如果日期字段没有数据,则该字段存储一个空值即'00000000'。
我们在进行SAP ECC数据质量治理工作中,在数据完整性约束条件下,大部分字段是不能写null值的,假如根据业务规定EKPO中的ERDAT日期不能为空(假如)
select * from sapsr3.ekpo a where a.erdat is null(错误)
或
select * from sapsr3.ekpo a where a.erdat=''(错误)
原因很简单,因为在底层数据库中该字段ERDAT默认值为'00000000',所以只要没有日期数据,那数据库中该字段实际存储的值为'00000000',而不是null值,正确的写法应该为
select * from sapsr3.ekpo a where a.erdat='00000000'
现在有个问题,那么为什么SAP ECC版本在非HANA数据库中存储的是日期默认值为'00000000'而不是默认为null值?期待大家回答。

















