Liebe Leut’,
ich denke, das Folgende müsste einfach gehen, ich kriege es bisher aber nur umständlich hin:
Tabelle A enthält ein Datumsfeld, genannt startdatum, die Jahre in startdatum sind nicht für alle Sätze in Tabelle A gleich. Tabelle B enthält ebenfalls ein Datumsfeld, genannt plandatum, außerdem ist sie über den Fremdschlüssel a_idn mit dem Primärschlüssel idn von Tabelle A verknüpft.
Es sollen jetzt neue Sätze für Tabelle B erzeugt werden, in denen Tag und Monat von plandatum gleich Tag und Monat von startdatum im passenden Satz aus Tabelle A sind, das Jahr aber neu und für alle neuen Sätze gleich. Ich kann also kein festes Intervall in Jahren angeben, das zu startdatum addiert werden könnte.
Also: Zu den Sätzen aus A:
idn startdatum
1 2006-08-01
2 2008-01-31
sollen in B erzeugt werden:
a_idn plandatum
1 2010-08-01
2 2010-01-31
usw. usf. Ich habe eine funktionierende, in meinen Augen aber hässliche Firebird-Lösung:
neujahr ist als char(4) deklariert, neudatum als date, und es wird so berechnet:
neudatum = CAST((neujahr || '-' || EXTRACT(MONTH FROM startdatum)
|| '-' || EXTRACT(DAY FROM startdatum)) AS DATE)
Das ist, wenn ich nicht irre, Standard-SQL pur, sollte also auch in PostgreSQL gehen. Aber eine Jahreszahl ist keine Zeichenkette! Und PostgreSQL hat ja mehr Datums- und Zeitfunktionen als Firebird, das nicht einmal INTERVAL kennt. Trotzdem finde ich keine Funktion, die mir erlaubt, ein Datum aus den drei Zahlen Jahr, Monat, Tag zusammenzusetzen, ohne sinnwidrige Umwege über Zeichenketten zu gehen.
Habe ich Tomaten auf den Augen?