2017-11-20 1 views
1

내 작업은 ABAP 스타일 날짜 (즉, 문자열 "20171120"로 표시되는 2017-11-20)를 통해 HANA 날짜로 변환하는 것입니다. SQL 스크립트. 이것은 쉽게 수행 할 수 있습니다SAP HANA : 빈 날짜에 null 값을 유지하면서 sqlscript를 사용하여 abap 날짜를 hana 날짜로 변환

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

그러나 또 다른 요구 사항이 다음 ABAP 날짜가 초기 인 경우 (값 '00000000') 데이터베이스가 null 값을 저장하여야한다. 나는 '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 

을하지만이 더러운 해킹처럼 보인다. 더 우아한 솔루션에 대한 아이디어가 있습니까?

답변

1

DATS_TO_DATE는 이 아니며은 주어진 날짜가 초기 값 (0000-00-00)이지만 특별한 날짜 값 (정확하게 -1-12-31)이면 NULL을 반환합니다.

는 요청에 따라, 다음 문을 사용,이 경우에 NULL 값을 수신하려면 : (? DATS_TO_DATE(), DATS_TO_DATE를 ('00000000'))

NULLIF를

전자. g :

INSERT INTO null_test VALUES (NULLIF (DATS_TO_DATE ('00000000'), DATS_TO_DATE ('00000000')))); => NULL을 반환합니다.

INSERT INTO null_test VALUES (NULLIF (DATS_TO_DATE ('20171224'), DATS_TO_DATE ('00000000')))); => 2017-12-24를 반환합니다.

지루한 문자열 연산이 없으므로이 구문은 좋은 성능을 제공합니다.

+0

Eclipse에서 내부 값 '-1-12-31'은 '?'(null과 동일)로 표시됩니다. "선택 ... 필드가 null 인 경우"와 만 차이점을 볼 수 있습니다. 당신 말이 맞아요, DATS_TO_DATE는 null이 아닙니다. – Psio

+0

좋은 지적! 특별한 날짜 값이 클라이언트 (이 경우에는 JDBC)로 전송 될 때 실제로 NULL 값으로의 변환이 발생합니다. 그런 다음 클라이언트 소프트웨어는 유효한 Java 날짜 유형 (null 값의 날짜)에 매핑됩니다. –

+0

특수한 "INITIAL"날짜를 사용하면 해당 열에서 NULL 값을 피할 수 있습니다. 컬럼 스토어 테이블의 경우이 초기 날짜에 대한 공간 요구 사항이 증가하지 않지만 SQL 문은 잠재적 인 NULL 값을 처리하기 위해 추가 논리를 고려하지 않고도 작동 할 수 있습니다. 결국이 값을 유지하려고 할 수 있습니다. –

3

내 프레젠테이션 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의 출력 표현이다.

+0

스택 오버플로가 좋습니다. 효과가 있습니다. 감사! – Psio

+0

성능이 dats_to_date() 함수보다 훨씬 좋습니다! – Psio