将 ABAP 日期转换为 HANA 日期,如果为空则返回 NULL

Convert ABAP date to HANA date returning NULL if empty

我的任务是通过 sql 脚本将 ABAP 样式日期(即表示为字符串“20171120”的 2017-11-20)转换为 HANA 日期。这可以通过以下方式轻松完成:

select to_date('20171120','YYYYMMDD') from dummy;

但是还有一个要求:如果 abap 日期是初始的(值 '00000000'),数据库应存储一个空值。我找到了一个可行的解决方案:如果只找到 'Z',我将潜在的初始日期“00000000”替换为 'Z' 并将 trim 字符串替换为 null:

select to_date(trim(leading 'Z' from replace('00000000','00000000','Z')),'YYYYMMDD') from dummy;
-- result: null
select to_date(trim(leading 'Z' from replace('20171120','00000000','Z')),'YYYYMMDD') from dummy;
-- result: 2017-11-20

但这看起来像是一个肮脏的黑客。有人有更优雅的解决方案的想法吗?

正如我在演示文稿中所解释的那样 Innovation with SAP HANA - What are my options 确实没有必要进行所有字符串操作。

相反,在处理 ABAP 日期和时间数据时使用适当的转换函数。在这种情况下,DATS_TO_DATE 是正确的函数。

with in_dates as
(            select '20171120' as in_date from dummy
  union all  select '00000000' as in_date from dummy)

select 
        dats_to_date(in_date)
      , in_date 
from in_dates;


|DATS_TO_DATE(IN_DATE)   |IN_DATE 
-------------------------+---------
|2017-11-20              |20171120
|?                       |00000000

此处的 ?NULL 的输出表示。

DATS_TO_DATE not return NULL 如果给定日期是初始日期 (0000-00-00),但特殊日期值 (-1 -12-31 准确)。

在这种情况下,要按照您的要求接收 NULL 值,请使用以下语句:

NULLIF(DATS_TO_DATE(?),DATS_TO_DATE('00000000'))

e。 g.:

插入 null_test 值 (NULLIF( DATS_TO_DATE('00000000'), DATS_TO_DATE('00000000'))); => returns NULL

插入 null_test 值 (NULLIF( DATS_TO_DATE('20171224'), DATS_TO_DATE('00000000'))); => returns 2017-12-24

由于不涉及繁琐的字符串操作,该语句应该会产生良好的性能。