PDA

View Full Version : jjjjmmtt in SQL funktion week



ILEMax
14-11-08, 13:04
Hi.
in der DB steht ein Datum als Numerischer Wert in der Form JJJJMMTT.

Interaktives SQL, V5R4

Select week(feld) from datei
->Argument 1 der Funktion WEEK ungültig.

Select week(char(feld)) from datei
-> ++++++++

Select week(date(feld)) from datei
-> ++++++++

muß ich das Feld auseinander bauen umd mit '-' in die form jjjj-mm-tt bringen

das muß doch einfacher gehen ?!

danke
Max

Fuerchau
14-11-08, 14:19
Das ist leider korrekt:

date(substr(digits(feld), 1, 4) || '-' || substr(digits(feld), 5, 2) || '-' concat(substr(digits(feld), 7, 2))

B.Hauser
14-11-08, 15:40
Hallo,

um die skalare Funktion Week oder Week_ISOzu verwenden, musst Du ein Datumsfeld, eine Zeitmarke oder eine gültige alphanumerische Darstellung verwenden. Gültige alphanumerische Darstellungen sind 'JJJJ-MM-TT', 'TT.MM.JJJJ', 'MM/TT/JJJJ'.

Wenn Du die Kalenderwoche nach ISO Richtlinien (Woche beginnt mit Montag und die Mehrzahl des neuen Jahres muss in Kalenderwoche 1 liegen, d.h. der 31.12. kann in KW1 liegen bzw der 01.01. kann in KW 53 liegen) ermitteln willst, solltest Du die Funktion WEEK_ISO verwenden. Bei WEEK ist der 1. Januar immer in KW1!

Die einzige Variante, die mir sonst noch einfällt, um ein numerisches Datum zu verwenden ist:


select week_iso(Timestamp(Digits(DatNum) concat '000000'))
from MyTable


Birgitta

ILEMax
14-11-08, 15:59
Danke euch Beiden,
so ist zumindest die schreibweise kürzer, das hilft schon.
week und week_iso kenn ich, auch der date(substr(digits ... ist bekannt (das fand ich ja so schrecklich).

Kannst du das etwas zur performance sagen
Timestamp vs date(substr(digits..

Wenn ich den Begriff als group brauche oder als where ...
Ich dachte das geht mit ... as woche
where woche = ... group by woche

aber das geht auch nicht, gibt es da noch einen trick (ausser ne funktion)

Danke
Max

Fuerchau
14-11-08, 16:39
Trick 1:
In Group By ist der gesamte Ausdruck zu wiederholen.

Trick 2:

with xTemp as (
select .... date(.....) as mydate
from ...
)
select ...
group by ..., mydate, ...

Bei Week_ISO ist noch zu berücksichtigen, dass die Funktion nur die Woche OHNE Jahr ermittelt.

Die Woche 01 kann daher das aktuelle oder bereits das Folgejahr, die Woche 53 das Vor- oder aktuelle Jahr sein.

Du musst also hier noch das Jahr dieser Woche mit berücksichtigen!

case week_iso(mydate)
when 1
case month(mydate)
when 12 then year(mydate) + 1 else year(mydate) end
when 53
case month(mydate)
when 1 then year(mydate) - 1 else year(mydate) end
else
year(mydate)
end as weekyear

B.Hauser
14-11-08, 18:43
Hallo,

Correlation Names (z.B. Woche) können im gleichen Sub-Select nicht verwendet werden. Deshalb muss entweder der Ausdruck im Group by wiederholt werden oder eine Common Table Expression oder ein weiterer Sub-Select verwendet werden.

zu einem Sub-Select gehören:
Select ... From ... Where ... Group By ... Having

Mehrere Sub-Selects können über UNION, INTERSECT oder EXCEPT zu einem Full-Select verknüpft werden.

Order By liegt außerhalb des Full-Selects. Deshalb kann ein Correlation-Name, der in einem Sub-Select definiert wurde hier auch angegeben werden.

Birgitta