Преобразование даты ABAP в дату HANA, возвращающую NULL, если пусто

Моя задача - преобразовать дату в стиле ABAP (т.е. 2017-11-20, которая представлена ​​​​строкой «20171120») в дату HANA с помощью сценария sql. Это можно легко сделать:

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

Но есть еще одно требование: если дата abap является начальной (значение '00000000'), база данных должна хранить нулевое значение. Я нашел рабочее решение: я заменяю потенциальную начальную дату «00000000» на «Z» и обрезаю строку до нуля, если найдено только «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

Но это похоже на грязный взлом. Есть ли у кого-нибудь идея более элегантного решения?


person Psio    schedule 20.11.2017    source источник


Ответы (2)


DATS_TO_DATE не возвращает 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'))); => возвращает NULL

ВСТАВИТЬ В ЗНАЧЕНИЯ null_test (NULLIF(DATS_TO_DATE('20171224'), DATS_TO_DATE('00000000'))); => возвращает 2017-12-24

Поскольку нет утомительных строковых операций, этот оператор должен обеспечить хорошую производительность.

person TheSpecter    schedule 23.11.2017
comment
В Eclipse внутреннее значение «-1-12-31» отображается как «?», идентичное нулю. Только с помощью select... где поле равно null, вы можете увидеть разницу. Вы правы, DATS_TO_DATE возвращает не нуль. - person Psio; 23.11.2017
comment
Хорошая точка зрения! Преобразование в значение NULL действительно происходит, когда специальное значение даты передается клиенту (в данном случае JDBC). Затем клиентское программное обеспечение сопоставляется с допустимым типом даты Java, который является датой с null значением. - person Lars Br.; 29.11.2017
comment
Вероятно, полезно отметить, что использование специальной даты INITIAL позволяет избежать значений NULL в этом столбце. Для таблиц хранилища столбцов нет повышенных требований к пространству для этой НАЧАЛЬНОЙ даты, но операторы SQL теперь могут работать без необходимости учитывать дополнительную логику для обработки потенциальных значений NULL. Таким образом, вы можете захотеть сохранить это значение в конце концов. - person Lars Br.; 30.11.2017

Как объяснялось в моей презентации Инновации с 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.

person Lars Br.    schedule 21.11.2017
comment
Производительность также намного выше с функцией dats_to_date()! - person Psio; 21.11.2017