-
ok, das ISO kam aber später oder??
(Danke)
-
Fast gut
leider gibt es auch jjjj mm und tt Felder die leer sind.
Um das abzufangen habe ich nun
Code:
SELECT dec(coalesce(replace(char( date(digits(jjjj) CONCAT '-'
CONCAT digits(mm) CONCAT '-' CONcat digits(tt))-5 DAYS ,
iso), '-', ''), 0), 8, 0) AS DATUM, jjjj*10000+mm*100+tt
FROM datei
drumherum gebaut
das bringt aber bei den leeren jjjj Feldern zrotzdem in der Anzeige nur +++++
-
auch in Birgittas version
Code:
SELECT Dec(coalesce(VarChar_Format(Timestamp(Digits(jjjj) concat
Digits(mm) concat Digits(tt) concat '000000')+ 5 Days ,
'YYYYMMDD'), 0), 8, 0) , jjjj*10000+mm*100+tt FROM datei
-
Ungültige Daten kann man da leider nicht in ein Datum umsetzen, dass kannst du nur mit einem Case-Ausdruck eingrenzen.
Zusätzlich passiert ja noch folgendes:
Im STRSQL, also Dialog, schafft SQL es diese Daten dann zu überlesen.
Im embedded SQL geht das nur, wenn du NULL-Anzeiger verwendest, ansonsten kommt ein Fetch nicht über den fehlerhaften Satz hinaus.
Solange du sicher sein kannst, dass in den Daten, wenn sie <> 0 sind, nur gültige Daten drinn stehen, kannst du einen Case-Ausdruck verwenden:
case
when JJJJ <> 0 and MM <> 0 and TT <> 0
then DateAusdruck
else NULL
end
Auch hier benötigst du natürlich bei embedded SQL einen NULL-Anzeiger.
PS:
ISO kam tatsächlich erst beim Edit, das das Datumformat bei mir in STRSQL immer auf *ISO steht.
-
Ach übrigens:
man kann auch folgendes kodieren:
date('0001-01-01') + (JJJJ - 1) years + (MM - 1) months + (TT - 1) days
Das liefert dir dann immer ein gültiges Datum.
-
Sowas hatte ich auch kurz überlegt aber ...
knallt der nicht, wenn ich - 5 days rechne ?
Der ILEMax
-
Nun ja, dann nimm ein anderes Jahr und rechne dieses wieder runter:
date('1900-01-01') + (case JJJJ when 0 then 0 else -1900 end) years + (MM - 1) months + (TT - 1) days
Ob das dann ein sinnvolles Datum ist ...
-
knallt auch ....
Code:
SELECT dec(coalesce(replace(char( date('0001-01-01') +
(dec(digits(jjjj), 4, 0)-1) years +
(dec(digits(mm), 2, 0)-1) month +
(dec(digits(tt), 2, 0)-1) days - 5 days, iso
), '-', ''), 0), 8, 0) AS DATUM, jjjj*10000+mm*100+tt from datei
-
Da machst du doch einiges zu viel.
Die Felder JJJJ, MM, TT sind doch numerisch!!!
Was soll das Casten auf Char und DEC?
Und coalesce hilft dir da nicht, da die Berechnung nicht NULL ergibt sondern einen Fehler.
Versuch es doch mal mit meinem Bespiel.
-
Ich hatte mir da mal was gebastelt:
<code>
CREATE FUNCTION USMOD_16/DATESERIAL
(YEAR INTEGER,
MONTH INTEGER,
DAY INTEGER)
RETURNS DATE
LANGUAGE RPGLE
EXTERNAL NAME 'USMOD_16/DATSER'
DETERMINISTIC
RETURNS NULL ON NULL INPUT
NO SQL
NO EXTERNAL ACTION
PARAMETER STYLE SQL
ALLOW PARALLEL
NOT FENCED
hactgrp(*caller) dftactgrp(*no) datfmt(*iso)
d SYear s 10I 0
d SMonth s 10I 0
d SDay s 10I 0
d SQLDate s d
d SYear_Ind s 5I 0
d SMonth_Ind s 5I 0
d SDay_Ind s 5I 0
d SQLDate_Ind s 5I 0
d SQLState s 5
d FuncName s 139 varying
d SpecName s 128 varying
d DiagMsg s 70 varying
c *entry plist
c parm SYear
c parm SMonth
c parm SDay
c parm SQLDate
c parm SYear_Ind
c parm SMonth_Ind
c parm SDay_Ind
c parm SQLDate_Ind
c parm SQLState
c parm FuncName
c parm SpecName
c parm DiagMsg
c*
c/free
if SYear_ind <> *zero
or SMonth_ind <> *zero
or SDay_ind <> *zero;
SQLDate_ind = -1; // Ergebnis ist NULL
else;
monitor;
SQLDate = %date('0001-01-01')
+ %Years(SYear-1)
+ %Months(SMonth-1)
+ %Days(SDay-1);
on-error *all;
SQLDate_ind = -1; // Ergebnis ist NULL
endmon;
endif;
/end-free
c*
c return
</code>
Man kann das auch alles native in einer SQL-Prozedur kodieren.
Der Aufruf erfolgt dann in SQL so:
dateserial(JJJJ, MM, TT + n)
Bei Fehlern wird halt NULL geliefert.
Kleine Schmankerln:
1. des Monats: dateseriel(JJJJ, MM, 1)
Letzter des Monats: dateseriel(JJJJ, MM+1, 0)
-
ja, danke
da war wohl was mit dem Wald und den Bäumen ...
habe dein
date('1900-01-01') + (case JJJJ when 0 then 0 else -1900 end) years + (MM - 1) months + (TT - 1) days
in
date('1900-01-01') + (case JJJJ when 0 then 0 else jjjj-1900 end) years + (MM - 1) months + (TT - 1) days
geändert, dann geht es
nicht schön, aber selten ...
Danke
der ILEMax
-
Gegen Tippfehler ist ja niemand gefeit .
Und was das selten angeht: wenn mans braucht ?
Similar Threads
-
By christian_lettner in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 16-11-06, 10:15
-
By FNeurieser in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 11-10-06, 14:53
-
By malzusrex in forum IBM i Hauptforum
Antworten: 8
Letzter Beitrag: 19-09-06, 11:04
-
By Kaufmann in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 28-06-06, 14:11
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 01-06-06, 09:43
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks