Stel je wilt alleen d?¡e verjaardagen als resultaat van een bepaalde datum tot een x aantal dagen ná die bepaalde datum, maar de overige verjaardagen niet?
Deze vraagstelling brengt enkele problemen met zich mee, bijvoorbeeld de filtering op jaaroverschrijdingen die uiteraard ook 100% correct moet verlopen.
Zelf kwam ik dit probleem een paar jaar geleden tegen. Ik heb toen een oplossing verzonnen voor SQL Server 7.0. Het doel van het SQL script was om serverside het hele probleem op te lossen. Effecientie heeft de nadruk niet op gelegen, omdat verjaardagen over het algemeen niet met 10000den tegelijk worden verwerkt.
De parameters moeten de volgende waarden krijgen:
Year1 = jaartal van de gewenste start-datum
Year2 = jaartal+1 van de gewenste start-datum
Date1 = gewenste startdatum
Date2 = gewenste startdatum + aantal dagen voor overzicht + 1
Het betreffende script toonde voor een pakket dat ik ooit schreef, de verjaardagen van zowel klanten als personeelsleden van de komende x dagen, bij de start van het programma. Tot dit doel is een FULL OUTER JOIN opgenomen met als conditie (1=0) om geen kruisbestuivingen van klanten en personeel te krijgen op één resulterende row. Dit hele stuk kan uiteraard verwijderd worden als uit maar één tabel wordt geretrieved.
Of het onderstaande IB compatible is weet ik niet, ik gebruik IB niet. Anders: Veel plezier bij het omschrijven. ;-)
Tot slot nog de opmerking dat als ik het script zo bekijk dat er veel optimalisatie / versimpeling mogelijk LIJKT. Ach ja, een paar jaar geleden was dit één van mijn eerste 20 scripts. Ik daag u uit. ;-)
Code:
SELECT
PersonalNo,
ClientNo,
ISNULL(P.RNaam,C.RNaam) Naam,
ISNULL(P.RGebDat,C.RGebDat) GebDat,
ISNULL(P.ROrderFoo,C.ROrderFoo) ROrderFoo
FROM
(
SELECT PersonalNo,Name RNaam,Verjaardag RGebDat,
(CONVERT(DATETIME,
CAST(DATEPART(MONTH,Verjaardag) AS VARCHAR)+'/'+
CAST(DATEPART(DAY,Verjaardag) AS VARCHAR)+'/1800',101)) ROrderFoo
FROM personal
WHERE
(IsActive=1)
AND
(
(
CONVERT(
DATETIME,
CAST(DATEPART(MONTH,Verjaardag) AS VARCHAR)+'/'+
CAST(DATEPART(DAY,Verjaardag) AS VARCHAR)+'/'+:Year1,
101)
BETWEEN :Date1 AND :Date2
)
OR
(
CONVERT(
DATETIME,
CAST(DATEPART(MONTH,Verjaardag) AS VARCHAR)+'/'+
CAST(DATEPART(DAY,Verjaardag) AS VARCHAR)+'/'+:Year2,
101)
BETWEEN :Date1 AND :Date2
)
)) AS P
FULL OUTER JOIN
(
SELECT ClientNo,ComName RNaam,BirthDate RGebDat,
(CONVERT(DATETIME,
CAST(DATEPART(MONTH,BirthDate) AS VARCHAR)+'/'+
CAST(DATEPART(DAY,BirthDate) AS VARCHAR)+'/1800',101)) ROrderFoo
FROM clients
WHERE
(IsActive=1)
AND
(
(
CONVERT(
DATETIME,
CAST(DATEPART(MONTH,BirthDate) AS VARCHAR)+'/'+
CAST(DATEPART(DAY,BirthDate) AS VARCHAR)+'/'+:Year1,
101)
BETWEEN :Date1 AND :Date2
)
OR
(
CONVERT(
DATETIME,
CAST(DATEPART(MONTH,BirthDate) AS VARCHAR)+'/'+
CAST(DATEPART(DAY,BirthDate) AS VARCHAR)+'/'+:Year2,
101)
BETWEEN :Date1 AND :Date2
)
)
) AS C
ON
(1=0)
ORDER BY
ROrderFoo
Bookmarks