webForumDet fria alternativet

DATEDIFF och åldrar

1 svar · 515 visningar · startad av matlin

matlinMedlem sedan okt. 2006228 inlägg
#1

Hallå allihopa. Jag har suttit och kliat mig i huvudet hela dagen och få ordning på DATEDIFF i t-sql. Jag hittade kod som jag arbetat utifrån på nätet:

DECLARE @givendate datetime, @date datetime, @tmpdate datetime, @years int, @months int, @days int
SELECT @date = '1997-01-30'
SELECT @givendate = '2010-01-29'

SELECT @tmpdate = @date

SELECT @years = DATEDIFF(yy, @tmpdate, @givendate) - CASE WHEN MONTH(@date) > MONTH(@givendate) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)
SELECT @months = DATEDIFF(m, @tmpdate, @givendate) - CASE WHEN DAY(@date) > DAY(@givendate) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(m, @months, @tmpdate)
SELECT @days = DATEDIFF(d, @tmpdate, @givendate)

SELECT @years as years, @months as months, @days as days

Om följande kod körs så får jag 13 år, -1 månad, 30 dagar. Vilket inte alls stämmer, snarare borde det vara 12 år, 12 månader, 30 dagar. Detta löser sig inte förrän jag går en månad till bakåt i tiden i "@givendate".

Ändrar jag däremot "@givendate" till 2010-01-31 så blir resultatet precis så jag vill ha det: 13 år, 0 månader, 1 dag.

Finns det någon vänlig själ som skulle kunna skjuta mig i rätt riktning?

//matlin

matlinMedlem sedan okt. 2006228 inlägg
#2

Ajja, nu lyckades jag lösa det. Har ingen aning vad koden gör, men det fungerar i varje fall på de svåra situationerna jag testat. Här är koden om någon annan skulle behöva:

DECLARE @givendate datetime, @date datetime, @tmpdate datetime, @years int, @months int, @days int
SELECT @date = '1997-01-30'
SELECT @givendate = '2010-01-29'

SELECT @tmpdate = @date

SELECT @years = case when month(@date)>month(@givendate) then datediff(yyyy,@date,@givendate)-1 
                  when month(@date)<month(@givendate) then datediff(yyyy,@date,@givendate) 
                  when month(@date)=month(@givendate) then 
                        case when day(@date)>day(@givendate)
                              then datediff(yyyy,@date,@givendate)-1 
                        else datediff(yyyy,@date,@givendate) end 
                  end
SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)
SELECT @months = DATEDIFF(m, @tmpdate, @givendate) - CASE WHEN DAY(@date) > DAY(@givendate) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(m, @months, @tmpdate)
SELECT @days = DATEDIFF(d, @tmpdate, @givendate)

SELECT @years as years, @months as months, @days as days
Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb