generic, FBs Source funktioniert durchaus, wenngleich mir der
SQL Server 2012 zum testen fehlt. Logisch ist das einwandfrei, sofern Verträge immer nur zum 1. beginnen können:
* Als erstes wird für jede Zeile entweder der 1.1.2012 oder das Anfangsdatum zurückgegeben, je nachdem, was größer ist
* dann wird das Enddatum oder der 31.12. zurückgegeben, je nachdem, was kleiner ist.
* dann fliegen alle die raus, bei denen nicht mindestens 1 Monat (Rundungsverhalten DateDiff? - bei Verträgen, die mitten im Monat beginnen) zwischen Anfang und Ende liegt.
Wenn Anfang nach dem 31.12.2012, dann fliegt der Tupel raus, weil dmax<dmin
Wenn Ende vor dem 1.1.2012, dann fliegt der Tupel raus, weil dmax<dmin
Wenn Anfang nach dem 1.1.2012 und Ende davor, dann ist dmin der richtige Anfang und dmax das richtige Ende.
Wenn Anfang vor dem 1.1.2012 und Ende zwischen 1.1.und 31.12., dann ist dmin 1.1. und dmax das richtige Ende
Wenn Anfang zwischen 1.1. und 31.12. und Ende danach, dann ist dmin der richtige Anfang und dmax 31.12.
Paßt also alles.
Ich würde das zwar anders machen (s.o.), weil ich meist alle Tupel haben und bei denen, die nicht betroffen sind, eine 0 drinstehen haben möchte, aber das ist kosmetisch.