View Full Version : DATE-Wert aus vier INT Werten JH, JJ, MM, TT
scireum_mha
09-05-14, 15:14
Hallo zusammen,
das verwendete WWS (nicht von uns) hat immer lustige vier Ganzzahlen Jahrhundert, Jahr, Monat, Tag.
Man kann das ganze nun in einen Date Wert umrechnen:
DATE(CAST(G1JHTB*100+G1JJTB as CHAR(4))||'-'||G1MMTB||'-'||G1TTTB)
Es tut, ich finds aber häßlich.
Daher die Frage:
Geht das irgendwie auch schicker?
Eventuell so in der Richtung: datexy(year, month, day).
Vielen Dank für alle Hinweise.
Michael Haufler
scireum GmbH - http://www.scireum.de
Es gibt schon andere Methoden, aber ob die unbedingt schicker sind?!
Aktuell kann SQL nur gültige alphanumerische Darstellungen eines Datums oder Zeitmarke konvertieren. Sofern SQL ein numerisches Datum konvertieren soll muss dieses (zumindest unter 7.1) der rechnerischen Anzahl der Tage seit dem 01.01.0001 entsprechen.
Die folgende Lösung könnte vielleicht etwas einfacher sein (allerdings nur wenn die Spalten gepackt oder gezont 2, 0 definiert sind. Sollte es sich um echte Integer-Werte handeln, müssen die numerischen Werte gecastet werden:
Date(Digits(G1JHTB) concat Digits(G1JJTB) concat
Digits(G1MMTB) concat Digits(G1TTTB) concat '000000')
Date(Right(Digits(G1JHTB), 2) concat Right(Digits(G1JJTB), 2) concat
Right(Digits(G1MMTB), 2) concat Right(Digits(G1TTTB), 2) concat '000000')
Um das ganze zu vereinfachen, kannst Du auch eine UTF (user defined function) schreiben und diese ausführen. Der Vorteil bei UDFs Du kannst fehlerhafte Daten abfangen.
Etwa so:
Create Function YOURSCHEMA/CVTHJMD2DT
(ParJHD Decimal(2, 0) ,
ParJJ Decimal(2, 0) ,
ParMM Decimal(2, 0) ,
ParTT Decimal(2, 0) )
Returns Date
Language SQL
Begin
Declare Continue Handler for SQLSTATE '22007'
Return Date('0001-01-01');
Return Date(Digits(ParJHD) concat Digits(ParJJ) concat
Digits(ParMM) concat Digits(ParTT) concat '000000');
End;
Aufruf der UDF:
Select CVTHJMD2DT(G1JHTB, G1JJTB, G1MMTB, G1TTTB)
From YourTable;
Birgitta
camouflage
09-05-14, 16:20
So als Beifang aus dem Netz...
SELECT CAST(CAST(G1JHTB + 19000000 AS VARCHAR) AS DATETIME)
(ungeprüft und ohne Garantie)
in RPG würd's dann so aussehen:
dcl-s ISODATE Date(*ISO)
ISODATE = %Date(G1JHTB: *CYMD)
... kommt drauf an was man unter chic versteht. Für mich wäre chic, wenn die Tabellen ein Datumsfeld verwenden, wenn ein Datum gespeichert werden soll.
Das zweit chicste wäre, wenn es jeweils eine View gäbe, die mir diesen Unfug vom Hals hält, wie die View das macht, könnte mir dann egal sein, wenn es denn stimmt, wenig Strom kostet und schnell ist.
Die UDF Lösung sieht dafür auf den ersten Blick sehr schön aus, hat aber einen wesentlichen Haken, das ist nicht schnell und kostet viel Strom, weil es mir viele Table Scans einbringt, wenn die Datumsfelder in where und/oder join Klauseln verwendet werden. Deshalb würde ich da eher eine zusätzliche Translation table vorsehen, die hat ein richtiges Datum als Keyfeld und dann die vier Ganzzahlen als columns (zusätzlich kann die noch Felder für Ultimo, Quartal, Eier Woche haben); selbige muss natürlich für alle vorkommenden Daten gefüllt sein. Letzteres hört sich kompliziert an, aber wenn ich dir für 100 Jahre mit allen Daten fülle sind das < 40.000 Sätze und dürfte für die meisten kommerziellen Anwendungen reichen.
D*B