[ABAP] OADate (Ole Automation Date) in Zeitstempel (timestamp) umrechnen

* https://stackoverflow.com/questions/43519005/how-to-convert-java-date-to-oadate-or-vice-versa
* https://msdn.microsoft.com/de-de/library/system.datetime.tooadate(v=vs.110).aspx

* Zeitstempel im OADate-Format
DATA: lv_oadate TYPE decfloat34 VALUE '43013.765983796296296000'. " 05.10.2017 18:23:01
*DATA: lv_oadate TYPE decfloat34 VALUE '42909.777881944444444000'. " 23.06.2017 18:40:09
*DATA: lv_oadate TYPE decfloat34 VALUE '42370.000717592592592593'. " 01.01.2016 00:01:02
* Basisdatum für OADate ist der 30.12.1899
DATA: lv_basedate TYPE d VALUE '18991230'.

DATA: lv_oadays TYPE i.
DATA: lv_oatime TYPE decfloat34.
DATA: lv_hour TYPE decfloat34.
DATA: lv_min TYPE decfloat34.
DATA: lv_sec TYPE decfloat34.

DATA: lv_d TYPE d.
DATA: lv_t TYPE t.
DATA: lv_datetime TYPE timestamp.

* Vorkommateil: Tage seit Basisdatum
lv_oadays = trunc( lv_oadate ).
* Nachkommateil: Tageszeit
lv_oatime = lv_oadate - CONV decfloat34( lv_oadays ).
* Nachkommateil: Stunden
lv_hour = lv_oatime * 24.
* Nachkommateil: Minuten
lv_min = ( lv_hour - trunc( lv_hour ) ) * 60.
* Nachkommateil: Sekunden
lv_sec = round( val = ( ( lv_min - trunc( lv_min ) ) * 60 ) dec = 0 ).

* Datum: Basisdatum + Tage des Vorkommateils
lv_d = lv_basedate + lv_oadays.
* Uhrzeit
lv_t = |{ CONV string( trunc( lv_hour ) ) WIDTH = 2 ALPHA = IN }{ CONV string( trunc( lv_min ) ) WIDTH = 2 ALPHA = IN }{ CONV string( trunc( lv_sec ) ) WIDTH = 2 ALPHA = IN }|.

* Datum und Uhrzeit in einem Zeitstempelobjekt zusammenfassen
CONVERT DATE lv_d TIME lv_t INTO TIME STAMP lv_datetime TIME ZONE 'UTC'.

WRITE: / '     OADate:', lv_oadate.
WRITE: / 'Zeitstempel:', lv_datetime TIME ZONE 'UTC'.

[ABAP] Numerische Funktionen

DATA: x TYPE decfloat16 VALUE '-10.67'.

* Absolutwert: 10.67
WRITE: / |  abs: { abs( x ) }|.
* Vorzeichen: -1
WRITE: / | sign: { sign( x ) }|.
* nächstgrößerer ganzzahliger Wert: -10
WRITE: / | ceil: { ceil( x ) }|.
* nächstkleinerer ganzzahliger Wert: -11
WRITE: / |floor: { floor( x ) }|.
* Vorkommateil: -10
WRITE: / |trunc: { trunc( x ) }|.
* Nachkommateil: -0.67
WRITE :/ | frac: { frac( x ) }|.
* Ganzzahlige Potenzfunktion: x^n, wobei n >= 0: 113.8489
WRITE :/ | ipow: { ipow( base = x exp = 2 ) }|.
* Rundungsfunktion: -10.7
WRITE :/ |round: { round( val = x dec = 1 ) }|.
* Arcuscosinus [-1,1]
WRITE :/ | acos: { acos( '0.5' ) }|.
* Arcussinus [-1,1]
WRITE :/ | asin: { asin( '0.5' ) }|.
* Arcustangens
WRITE :/ | atan: { atan( '0.5' ) }|.
* Cosinus
WRITE :/ |  cos: { cos( '0.5' ) }|.
* Sinus
WRITE :/ |  sin: { sin( '0.5' ) }|.
* Tangens
WRITE :/ |  tan: { tan( '0.5' ) }|.
* Hyperbelcosinus
WRITE :/ | cosh: { cosh( '0.5' ) }|.
* Hyperbelsinus
WRITE :/ | sinh: { sinh( '0.5' ) }|.
* Hyperbeltangens
WRITE :/ | tanh: { tanh( '0.5' ) }|.
* Exponentialfunktion zur Basis e und x->[-709, 709] für Typ f und x->[-14144, 14149] für Typ decfloat34
WRITE :/ |  exp: { exp( x ) }|.
* natürlicher Logarithmus; x > 0
WRITE :/ |  log: { log( 2 ) }|.
* Logarithmus zur Basis 10; x > 0
WRITE :/ |log10: { log10( 2 ) }|.
* Quadratwurzel X >= 0
WRITE :/ | sqrt: { sqrt( 4 ) }|.