NextLytics Blog

SAP HANA TO DATE - Datumsfunktionen in HANA SQLScript erklärt

Geschrieben von Chris Fidanidis | 19.11.2020 14:18:31

In diesem Beitrag lernen Sie einige hilfreiche HANA SQLScript Datumsfunktionen kennen, die Sie in Ihren Transformationsroutinen verwenden können. Diese Funktionen erleichtern Ihre Arbeit enorm, da sie vordefinierte Logiken enthalten, die Sie nicht manuell programmieren müssen. Hier erkläre ich anhand von Beispielen, wie Sie die häufig auftretenden Anforderungen lösen können.

Mit TO_DATE Datum in SAP HANA DATE Format konvertieren

Der Datentyp DATE besteht aus Jahres-, Monats- und Tagesinformationen, um einen Datumswert darzustellen. Das Standardformat von diesem Datentyp ist YYYY-MM-DD. YYYY steht für das Jahr, MM für den Monat und DD für den Tag. Der Bereich liegt zwischen 0001-01-01 und 9999-12-31.

Mit der SQLScript Funktion TO_DATE können Sie eine Zeichenkette, die ein Datum repräsentiert, in den Datentyp DATE umwandeln. 

Die Syntax der Funktion lautet:

TO_DATE ([Zeichenkette], [Format])

Zum Beispiel:

SELECT TO_DATE('2020-09-01', 'YYYY-MM-DD') "DATE Format" FROM DUMMY;

Beachten Sie bitte, dass Sie bei Transformationsroutinen den ABAP Datentyp DATS im Format YYYYMMDD benötigen. Wenn Sie daher ein ADSO als Ziel der Transformation haben, müssen Sie stattdessen die SAP HANA Funktion TO_DATS verwenden.

Datum in ABAP Format mit SAP HANA Funktion TO_DATS konvertieren

Im Gegensatz zu TO_DATE Funktion, die eine Zeichenkette in das DATE Format YYYY-MM-DD umwandelt, wandelt die TO_DATS Funktion eine Zeichenkette in das DATS Format YYYYMMDD um. Dieses Format wird benötigt, um in BW Objekte wie ADSOs verbuchen zu können.

Die Syntax ist denkbar einfach:

TO_DATS ([Zeichenkette])

Zum Beispiel:

SELECT TO_DATS('2020-09-01') "DATS Format" FROM DUMMY;

Sie können diese Funktion in Verbindung mit anderen SAP HANA Funktionen, wie zum Beispiel ADD_DAYS kombinieren:

OUTTAB = SELECT
TO_DATS(ADD_DAYS(DATE0, 25)) AS DATE0,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Tage mit SAP HANA Funktion ADD_DAYS hinzufügen

Eine sehr häufige Anforderung besteht darin, Tage zu einem Datum hinzuzufügen. Die Funktion ADD_DAYS erleichtert Ihnen diese Arbeit. Diese HANA Funktion addiert die angegebene Anzahl der Tage zum angegebenen Datum. Dabei werden auch automatisch die Monate und Jahre hochgezählt.

Die Syntax der Funktion lautet:

ADD_DAYS ([Datum], [Anzahl der Tage])

Wobei das Datum das zu inkrementierende Datum angibt und Anzahl der Tage die Anzahl der Tage angibt, um die das Datum erhöht wird.

Im folgenden Beispiel fügen wir im Rahmen einer Transformationsroutine 25 Tage zum jeweiligen Datum hinzu:

OUTTAB = SELECT
TO_DATS(ADD_DAYS(DATE0, 25)) AS DATE0,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Monate mit der ADD_MONTHS Funktion hinzufügen

Neben den Tagen können Sie auch Monate hinzuaddieren. Nutzen Sie dazu die SAP HANA Funktion ADD_MONTHS. Diese addiert die angegebene Anzahl an Monaten zum angegebenen Datum hinzu.

Die Syntax der Funktion lautet:

ADD_MONTHS ([Datum], [Anzahl der Monate])

Wobei das Datum das zu inkrementierende Datum angibt und Anzahl der Monate die Anzahl der Monate angibt, um die das Datum erhöht wird.

Im folgenden Beispiel addieren wir ein Monat zum Datum hinzu:

OUTTAB = SELECT
TO_DATS(ADD_MONTHS(DATE0, 1)) AS DATE0,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Dies funktioniert auch über Jahre hinweg, wie das nächste Beispiel zeigt:

OUTTAB = SELECT
TO_DATS(ADD_MONTHS(DATE0, 12)) AS DATE0,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Die SAP HANA Funktion ADD_YEARS funktioniert analog. Diese fügt zum angegebenen Datum Jahre hinzu.

Aktuelles Datum in SAP HANA über CURRENT_DATE und CURRENT_UTCDATE hinzufügen

Manchmal benötigen Sie im Rahmen einer Transformationsroutine das aktuelle Datum. Zum Beispiel um einen Stichtag für die Währungsumrechnung zu bestimmen.

Um das aktuelle Datum zu ermitteln, können Sie die Funktion CURRENT_DATE nutzen. Diese gibt das aktuelle lokale Systemdatum zurück.

Anbei finden Sie ein Beispiel:

OUTTAB = SELECT
TO_DATS(CURRENT_DATE) AS DATE0,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Wenn Sie im internationalen Umfeld arbeiten, sollten Sie statt des lokalen Datums das UTC Datum nutzen. Die Verwendung von Ortszeiten und die Konvertierung zwischen lokalen Zeitzonen würde eine zusätzliche Handhabung im Code erfordern.

Nutzen Sie dazu die SAP HANA Funktion CURRENT_UTCDATE:

OUTTAB = SELECT
TO_DATS(CURRENT_UTCDATE) AS DATE0,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Monate und Jahre über SAP HANA EXTRACT Funktion herausfinden

Eine weitere häufige Anforderung ist die Extraktion von Monaten und Jahren aus einem Datum. Mit der EXTRACT Funktion können Sie diese Anforderung ganz einfach umsetzen. Dabei müssen Sie die einzelnen Informationen nicht mühselig über SUBSTRING herausfinden. Die Funktion findet den Wert automatisch heraus.

Die Syntax der Funktion lautet:

EXTRACT ({YEAR | MONTH | DAY | HOUR | MINUTE | SECOND} FROM [Datum])

So können Sie zum Beispiel das Kalenderjahr 0CALYEAR und den Kalendermonat 0CALMONTH2 aus dem Datum 0DATE über die Parameter YEAR und MONTH herauslesen:

OUTTAB = SELECT
DATE0,
EXTRACT(MONTH FROM DATE0) AS CALMONTH2,
EXTRACT(YEAR FROM DATE0) AS CALYEAR,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Zum selben Zweck können Sie die SAP HANA Funktionen MONTH und YEAR verwenden. Die MONTH Funktion gibt die Nummer des Monats ab dem angegebenen Datum zurück. Die Funktion MONTH gibt die Jahreszahl eines angegebenen Datums zurück:


OUTTAB = SELECT
DATE0,
MONTH (DATE0) AS CALMONTH2,
YEAR (DATE0) AS CALYEAR,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Steigern Sie die Leistung Ihres BW mit SQLScript

Anzahl der Tage zwischen zwei Daten mit SAP HANA Funktionen DAYS_BETWEEN und WORKDAYS_BETWEEN berechnen

Häufig muss auch die Anzahl der Tage bzw. Werktage berechnet werden, um zum Beispiel die Liefertreue eines Lieferanten zu bestimmen. Dazu können Sie die Funktionen DAYS_BETWEEN und WORKDAYS_BETWEEN nutzen. Die Funktion DAYS_BETWEEN gibt die Anzahl der Tage zwischen zwei Datumswerten zurück.

Die Syntax lautet:

DAYS_BETWEEN ([Startdatum], [Enddatum])

Zum Beispiel:

OUTTAB = SELECT
DATE0, CALDAY, CURRENCY, RECORDMODE, AMOUNT,
DAYS_BETWEEN(DATE0, CALDAY) AS "/BIC/ZDRDBTWN",
RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Allerdings ist es sinnvoller, bei der Berechnung der Liefertreue mit den Arbeitstagen zu rechnen. In diesem Fall kommt die Funktion WORKDAYS_BETWEEN zum Einsatz. Diese ermöglicht es, den Fabrikkalender zur Berechnung von Kennzahlen zu nutzen. In BEx Queries war dies bisher nur eingeschränkt möglich.

Die Syntax dieser Funktion lautet:

WORKDAYS_BETWEEN ([Fabrikkalender], [Startdatum], [Enddatum], [Quellschema])

Der Parameter Fabrikkalender gibt die ID eines Fabrikkalenders in der Fabrikkalender-Tabelle TFACS an. Die Fabrikkalender-Tabelle TFACS muss in der SAP-Datenbank HANA vorhanden sein, um die Funktion nutzen zu können. In SAP BW-, SAP CRM- und SAP ERP-Systemen, die auf einer SAP HANA-Datenbank laufen, befindet sich die Tabelle TFACS im ABAP-Schema SAP<SID>. Für andere SAP-HANA-Datenbanken kann die Tabelle TFACS aus einem SAP-Business-Suite-System repliziert werden.

Das Ergebnis wird als eine INTEGER Zahl zurückgegeben.

Wenn das [Startdatum] kleiner oder gleich dem [Enddatum] ist, dann wird die Anzahl der Arbeitstage in der Periode, die mit dem [Startdatum] beginnt und mit dem [Enddatum] endet, zurückgegeben. Die zurückgegebene Anzahl von Tagen schließt den Tag des [Startdatum] ein, schließt aber den Tag des [Enddatum] aus.

Wenn [Startdatum] nach [Enddatum] liegt, dann wird eine negative Anzahl von Arbeitstagen in dem Zeitraum zurückgegeben, der mit [Enddatum] beginnt und mit [Startdatum] endet. Die zurückgegebene Anzahl von Tagen schließt den Tag des [Enddatums] ein, schließt aber den Tag des [Startdatums] aus.

Nachfolgend finden Sie ein Beispiel:

OUTTAB = SELECT
DATE0, CALDAY, CURRENCY, RECORDMODE, AMOUNT,
WORKDAYS_BETWEEN('10', DATE0, CALDAY) AS "/BIC/ZDRDBTWN",
RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

Datensätze mit einem Zeitstempel versehen - SAP HANA Funktionen CURRENT_TIMESTAMP und CURRENT_UTCTIMESTAMP

Manchmal ist es nötig, Datensätze mit einem Zeitstempel zu versehen. Dazu können Sie die Funktion TIMESTAMP verwenden. Diese gibt den aktuellen Zeitstempel des lokalen Systems zurück.

Allerdings lautet der HANA-interne Format für den Zeitstempel YYYY-MM-DD HH24:MI:SS.FF7. FF.

Der Format des BW Zeitstempels 0TCTTIMSTMP lautet dagegen YYYYMMDDHHMMSS.

Daher müssen Sie den Typ mit der Funktion TO_NVARCHAR umwandeln:

TO_NVARCHAR(CURRENT_TIMESTAMP, 'YYYYMMDDHHMMSS')

Anbei finden Sie ein Beispiel für die Transformationsroutine:

PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY.
OUTTAB = SELECT
DATE0,
TO_NVARCHAR(CURRENT_TIMESTAMP, 'YYYYMMDDHHMMSS') AS TCTTIMSTMP,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

 

Wenn Sie im internationalen Umfeld arbeiten, sollten Sie UTC-Zeiten anstelle von lokalen Zeitstempeln verwenden. Die Verwendung von Ortszeiten und die Konvertierung zwischen lokalen Zeitzonen kann eine zusätzliche Behandlung im Anwendungscode notwendig machen.

Verwenden Sie in diesem Fall die Funktion CURRENT_UTCTIMESTAMP. Diese selektiert den aktuellen UTC Zeitstempel. Zum Beispiel:

OUTTAB   = SELECT
DATE0,
TO_NVARCHAR(CURRENT_UTCTIMESTAMP, 'YYYYMMDDHHMMSS')  AS TCTTIMSTMP,
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;

SAP HANA TO DATE - Unser Fazit

Wie Sie sehen, kann der Umstieg von ABAP auf SQLScript dank vordefinierten Funktionen erleichtert werden. Diese decken die häufigsten Anforderungen ab.

Möchten Sie mehr über Einsatzgebiete von SAP HANA SQLScript erfahren? Laden Sie sich unser aktuelles Whitepaper zu diesem Thema herunter! Sollten Sie Unterstützung bei der Definition der für Sie passenden HANA Strategie benötigen, zögern Sie bitte nicht, uns zu kontaktieren.