---
title: "DATEDIFF och åldrar"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/182911-datediff-och-åldrar"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "matlin"
published: "2010-03-22T15:40:53.000Z"
updated: "2010-03-23T09:34:27.000Z"
replies: 1
views: 536
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/182911-datediff-och-åldrar"
---

# DATEDIFF och åldrar

## #1 — matlin, 2010-03-22T15:40Z

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

Permalänk: https://www.webforum.nu/p/182911

## #2 — matlin, 2010-03-23T09:34Z

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
```

Permalänk: https://www.webforum.nu/p/2231548

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/182911-datediff-och-åldrar
