2017-11-20 71 views
1

私の仕事は、ABAPスタイル日付(つまり、20171120という文字列を20171120で表す)を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値を受け取り、次のステートメントを使用するには:

電子を

NULLIF(DATS_TO_DATEを()、DATS_TO_DATE( '00000000')?)。 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と同じです。 "select ... where field is null"の場合のみ、その違いを見ることができます。そうです、DATS_TO_DATEはnullを返しません。 – Psio

+0

良い点!特別な日付の値がクライアント(この場合はJDBC)に転送されると、NULL値への変換が実際に行われます。クライアントソフトウェアは、有効なJava日付型にマップされます。これはヌル値の日付です。 –

+0

特別な "INITIAL"日付を使用すると、その列のNULL値を避けることができます。列ストア表の場合、このINITIAL日付に必要なスペースは増えませんが、潜在的なNULL値に対応するために追加のロジックを考慮する必要なくSQL文を操作できるようになりました。結局のところ、この値を保持したいかもしれません。 –

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

関連する問題