Hej! Ser onödigt komplicerad ut. Gillar inte när det ligger affärslogik i datalagret, även när det bara handlar om att plussa på några dagar. I ditt expempel får jag ju bara ut vilka som är födda mellan två datum.Kontroll av kod
Vill någon vänlig själ kolla min procedur så att den fungerar i alla lägen?
Har säkert missat något eller så kan den säkert göras effektivare.
Det proceduren ska göra är att kontrollera vilka som fyller år from ett datum och x dagar framåt.
Inparametrar är fromdatum och antal dagar framåt.
T.ex. "Vilka fyller år en vecka framåt?" blir spBirthday 2004-08-10, 7
CREATE PROCEDURE spBirthday @date smalldatetime, @days int
AS
if datepart(yyyy,dateadd(d,@days,@date))<>datepart(yyyy,@date) -- nästa år
begin
select [id],birthdate
from tadrcontact
where
convert(smalldatetime,convert(varchar,datepart(yyyy,dateadd(d,@days,@date)))+'-'+
convert(varchar,datepart(mm,birthdate))+'-'+convert(varchar,datepart(dd,birthdate)))
>=@date
and
convert(smalldatetime,convert(varchar,datepart(yyyy,@date))+'-'+
convert(varchar,datepart(mm,birthdate))+'-'+convert(varchar,datepart(dd,birthdate)))
<=dateadd(d,@days,@date)
end
else -- innevarande år
begin
select [id],birthdate
from tadrcontact
where
convert(smalldatetime,convert(varchar,datepart(yyyy,@date))+'-'+
convert(varchar,datepart(mm,birthdate))+'-'+convert(varchar,datepart(dd,birthdate)))
>=@date
and
convert(smalldatetime,convert(varchar,datepart(yyyy,@date))+'-'+
convert(varchar,datepart(mm,birthdate))+'-'+convert(varchar,datepart(dd,birthdate)))
<=dateadd(d,@days,@date)
endSv: Kontroll av kod
Om du kan, ändra i koden och lägg på antal dagar redan där och skicka in två datum, från och till. Då löser du din fråga med.
CREATE PROCEDURE spBirthday
(
@fromdate smalldatetime,
@todate smalldatetime
)
AS
SELECT [id],birthdate
FROM tadrcontact
WHERE birthdate >= @fromdate
AND birthdate <=todate
ORDER BY birthdate DESC
Förutsätter också att birthdate är av typ smalldatetime. Vill du inte veta namn och annan info på personerna som fyller år? Utöka i så fall SELECT frågan. Eller vad gör du med listan med idnummer du får ut?
I min mening en mycket smidigare lösning som även är lättare att felsöka.
Sv: Kontroll av kod
Hur menar du att jag ska kunna få reda på vilka som fyller denna vecka?
Vilka datum ska jag skicka som parametrar; 2004-08-09 och 2004-08-15?
Problemet är årtalet, frågan ska returnera alla som fyller mellan 9:e augusti och 15:e augusti oavsett vilket år de är födda.
Tycker också att proceduren vart lite väl komplicerad, mycket på grund av att hänsyn måste tas till årsskiften.
Skalade bort övriga utfält innan postning här.