将 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
由于不涉及繁琐的字符串操作,该语句应该会产生良好的性能。
我的任务是通过 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
由于不涉及繁琐的字符串操作,该语句应该会产生良好的性能。