Anmelden

View Full Version : Im CL den Montag einer KW ermitteln



Seiten : [1] 2

cono2000
31-01-12, 09:20
Hallo zusammen,
ich versuche im CL vergeblich das Datum für den Montag einer Kalenderwoche zu ermitteln.
Beispiel: KW= 4 , JJ=12
Ermitteltes Datum: 23.01.2012
Wie das Datum aufbereitet ist, ist natürlich zweitrangig.

Hat das schon einer gemacht und kann mir weiterhelfen?
Eine Lösung in RPG würde mir allerdings auch weiterhelfen.

Danke für eure Hilfe.

RobertMack
31-01-12, 10:00
Hier ein Link zu einer Vorlage für ein Service Programm:

How to Determine the Week of the Year for a Given Date (http://www.as400pro.com/tipView.php?cat=RPG&key=262)

Gruß,
Robert

K_Tippi
31-01-12, 10:36
Hallo,
in RPGSQL habe ich eine Teillösung
NRTAG Montag = 1, Dienstag 2; ... Sonntag 7


/free
exec SQL
set : NRTAG = DayOfWeek_ISO(: Date);
/end-free
Damit hast du den Tag eines Datums und brauchst nur über die datumsfunktion rechnen + oder minus x Tage
Beispiel:
eval date2 = date + %days(1)

Ich hoffe das hilft

Klaus

Spateneder
31-01-12, 10:56
Hier ein Link zur Verwendung der Datums-APIs in CLLE:
Sample LE/date functions from CLPLE (http://www.as400pro.com/tipView.php?cat=CL&key=333)

Vorgehensweise für Dein Problem:


Wochentag des 1. Januar für das gesuchte Jahr ermitteln
Datum des ersten Montags im Jahr ermitteln
7er-Einmaleins

B.Hauser
31-01-12, 11:08
Hier ein Link zur Verwendung der Datums-APIs in CLLE:
Sample LE/date functions from CLPLE (http://www.as400pro.com/tipView.php?cat=CL&key=333)

Vorgehensweise für Dein Problem:


Wochentag des 1. Januar für das gesuchte Jahr ermitteln
Datum des ersten Montags im Jahr ermitteln
7er-Einmaleins

Man sollte dabei allerdings berücksichtigen, dass der erste Montag im Jahr nicht zwangläufig in der KW 1 liegen muss!
Die ISO Regeln lauten:
Die Woche beginnt mit einem Montag und die Mehrheit der Tage in der 1. Kalenderwoche muss aus dem neuen Jahr sein.
Was man sicher sagen kann ist, dass der erste Donnerstag im Jahr oder der 4. Januar immer in KW1 ist.

Ich hab das Ganze mal als SQL Funktion gemacht. Das könnte man in embedded SQL hinterlegen und dann aus CL aufrufen:



Create Function MySchema/Tag1KW
(ParYear Decimal(4, 0),
ParWeekIso Decimal(2, 0))
Returns Date
Language SQL
Begin
Declare Jan4 Date;
Set Jan4 = Date(Digits(ParYear) concat '-01-04');
If ParWeekISO <= 0
or ParWeekISO > Week_ISO(Jan4 + 1 Year - 7 Days)
Then Return Date('0001-01-01');
End If;
Return Jan4 + (((ParWeekIso - 1) * 7 + 1) - DayOfWeek_ISO(Jan4)) Days;
End;


Birgitta

Allrounder
23-03-12, 14:25
Man sollte dabei allerdings berücksichtigen, dass der erste Montag im Jahr nicht zwangläufig in der KW 1 liegen muss!
Die ISO Regeln lauten:
Die Woche beginnt mit einem Montag und die Mehrheit der Tage in der 1. Kalenderwoche muss aus dem neuen Jahr sein.
Was man sicher sagen kann ist, dass der erste Donnerstag im Jahr oder der 4. Januar immer in KW1 ist.

Ich hab das Ganze mal als SQL Funktion gemacht. Das könnte man in embedded SQL hinterlegen und dann aus CL aufrufen:



Create Function MySchema/Tag1KW
(ParYear Decimal(4, 0),
ParWeekIso Decimal(2, 0))
Returns Date)
Language SQL
Begin
Declare Jan4 Date;
Set Jan4 = Date(Digits(ParYear) concat '-01-04');
If ParWeekISO <= 0
or ParWeekISO > Week_ISO(Jan4 + 1 Year - 7 Days)
Then Return Date('0001-01-01');
End If;
Return Jan4 + (((ParWeekISO - 1) * 7 + 1 - DayOfWeek_ISO(Jan4)) Days;
End;

Birgitta

Auf der Suche nach einer SQL-Lösung zum gleichen Problem bin ich auf Deine Funktion gestoßen. Funktioniert prima (eine Klammer auf ist zu viel, aber kein Problem).

Vielen Dank, Birgitta!

malzusrex
06-09-12, 08:10
Hallo auch,

würde diese Funktion gern mal aus probieren, aber Klammertechnisch passt da was nicht. Kann da mir jemand weiter helfen ?

Danke
Ronald

andreaspr@aon.at
06-09-12, 08:59
Die Klammer nach "Returns Date)" gehört auf dem ersten Blick auf jeden Fall weg.

lg Andreas

andreaspr@aon.at
06-09-12, 09:00
Und die erste Klammer gehört auch weg :)
"Return Jan4 + ("

B.Hauser
06-09-12, 09:19
Ich habe den Source Code gerade nochmal ausprobiert und das Beispiel oben durch den geänderten Source Code ersetzt.

Birgitta