我的任务是将ABAP样式日期转换为" 2017-11-20",该日期以字符串为字符串" 20171120")通过SQL脚本转换为HANA日期。这可以通过以下方式轻松完成:
select to_date('20171120','YYYYMMDD') from dummy;
,但还有另一个要求:如果ABAP日期是初始(值'00000000'),则数据库应存储空值。我找到了一个有效的解决方案:我用" z"替换潜在的初始日期" 00000000",然后将字符串修剪为null,如果找到'z':
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
,但这看起来像是一个肮脏的黑客。有人有一个更优雅的解决方案的想法吗?
正如我与SAP HANA的演示创新中所解释的 - 我的选择是什么。
相反,在处理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 do 如果给定日期是初始日期(0000-00-00),则返回null,而是特殊的日期值(-1-12-31 to精确)。
在这种情况下,按照您的要求接收零值,请使用以下语句:
nullif(dats_to_date(?),dats_to_date('00000000'))
e。g。:
插入null_test值(nullif(dats_to_date('00000000'),dats_to_date('00000000'')));=>返回null
插入null_test值(nullif(dats_to_date('20171224'),dats_to_date('00000000'')));=>返回2017-12-24
由于不涉及乏味的字符串操作,因此该语句应产生良好的性能。