2

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

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

但是还有另一个要求:如果abap 日期是初始的(值'00000000'),数据库应该存储一个空值。我找到了一个可行的解决方案:如果只找到 'Z',我将潜在的初始日期 '00000000' 替换为 'Z' 并将字符串修剪为 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

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

4

2 回答 2

3

正如我在演示文稿中使用 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

于 2017-11-21T02:44:19.707 回答
1

如果给定日期是初始日期 (0000-00-00),则DATS_TO_DATE 不返回NULL,而是返回特殊日期值(准确地说是 -1-12-31)。

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

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

例如:

插入空测试值(NULLIF(DATS_TO_DATE('00000000'),DATS_TO_DATE('00000000')));=> 返回 NULL

插入空测试值(NULLIF(DATS_TO_DATE('20171224'),DATS_TO_DATE('00000000')));=> 返回 2017-12-24

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

于 2017-11-23T09:46:51.767 回答