Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
[Blue]DECLARE[/Blue] @Date1 [Blue]datetime[/Blue]
[Blue]DECLARE[/Blue] @Date2 [Blue]datetime[/Blue]
[Blue]SET[/Blue] @Date1[Gray]=[/Gray][Fuchsia]GetDate[/Fuchsia][Gray]([/Gray][Gray])[/Gray][Gray]-[/Gray]359
[Blue]SET[/Blue] @Date2[Gray]=[/Gray][Fuchsia]GetDate[/Fuchsia][Gray]([/Gray][Gray])[/Gray]
[Blue]SELECT[/Blue] [Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray][Blue]dd[/Blue][Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray]/360[Gray],[/Gray]
[Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray][Blue]dd[/Blue][Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]%[/Gray]360/30[Gray],[/Gray]
[Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray][Blue]dd[/Blue][Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]%[/Gray]30
How you write the query depends on your needs. What does your UDF return when you are born on 2/29 of a leap year and you evaluate it on 2/28/2005 and 3/1/2005? If the business rules get really nasty what do you do when your date and time of birth is recorded in UK and you evaluate it in USA? It's not a facetious point...it all depends.donutman said:Is this good enough or do you have a need that dictates the use of actual days in each month?
[Blue]DECLARE[/Blue] @Date1 [Blue]datetime[/Blue]
[Blue]DECLARE[/Blue] @Date2 [Blue]datetime[/Blue]
[Blue]SET[/Blue] @Date1[Gray]=[/Gray][red]'3/23/1970'[/red]
[Blue]SET[/Blue] @Date2[Gray]=[/Gray][Fuchsia]GetDate[/Fuchsia][Gray]([/Gray][Gray])[/Gray]
[Blue]SELECT[/Blue] [Blue]CASE[/Blue] [Blue]WHEN[/Blue] [Fuchsia]DateAdd[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray][Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray],[/Gray]@Date1[Gray])[/Gray][Gray]>[/Gray]@Date2 [Blue]THEN[/Blue] [Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]-[/Gray]1 [Blue]ELSE[/Blue] [Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray] [Blue]END[/Blue][Gray],[/Gray]
[Blue]CASE[/Blue] [Blue]WHEN[/Blue] [Fuchsia]DateAdd[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray][Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray],[/Gray]@Date1[Gray])[/Gray][Gray]>[/Gray]@Date2 [Blue]THEN[/Blue] [Gray]([/Gray][Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]-[/Gray]1[Gray])[/Gray][Gray]%[/Gray]12 [Blue]ELSE[/Blue] [Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]%[/Gray]12 [Blue]END[/Blue][Gray],[/Gray]
[Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray][Blue]dd[/Blue][Gray],[/Gray][Fuchsia]DateAdd[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray][Blue]CASE[/Blue] [Blue]WHEN[/Blue] [Fuchsia]DateAdd[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray][Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray],[/Gray]@Date1[Gray])[/Gray][Gray]>[/Gray]@Date2 [Blue]THEN[/Blue] [Gray]([/Gray][Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]-[/Gray]1[Gray])[/Gray][Gray]%[/Gray]12 [Blue]ELSE[/Blue] [Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]mm[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]%[/Gray]12 [Blue]END[/Blue] [Gray],[/Gray][Fuchsia]DateAdd[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray][Blue]CASE[/Blue] [Blue]WHEN[/Blue] [Fuchsia]DateAdd[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray][Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray],[/Gray]@Date1[Gray])[/Gray][Gray]>[/Gray]@Date2 [Blue]THEN[/Blue] [Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Gray]-[/Gray]1 [Blue]ELSE[/Blue] [Fuchsia]DateDiff[/Fuchsia][Gray]([/Gray]yy[Gray],[/Gray]@Date1[Gray],[/Gray]@Date2[Gray])[/Gray][Blue]END[/Blue][Gray],[/Gray]@Date1[Gray])[/Gray][Gray])[/Gray] [Gray],[/Gray]@Date2[Gray])[/Gray]
SELECT
Date1,
Date2,
Years = Y2 - Y1 -
CASE WHEN M1 > M2 OR (M1=M2 AND D1 > D2) THEN 1 ELSE 0 END,
Months = (M2 - M1 +
CASE WHEN D1 > D2 THEN 11 ELSE 12 END
) % 12,
Days = D2 - D1 +
CASE WHEN D1 > D2 THEN
CASE WHEN D1 > D2PM THEN D1 ELSE D2PM END
ELSE 0 END
FROM
(
SELECT
Date1,
Date2,
Y1 = DatePart(yy, Date1),
Y2 = Datepart(yy, Date2),
M1 = DatePart(m, Date1),
M2 = Datepart(m, Date2),
D1 = DatePart(d, Date1),
D2 = Datepart(d, Date2),
D2PM = DatePart(d, DateAdd(m, DateDiff(m, 0, Date2), -1))
FROM
#BDates
) Calc
CREATE TABLE #BDates (Date1 datetime, Date2 datetime)
INSERT #BDates
SELECT '1965-07-29 07:47:57.233', '2005-02-28 15:16:20.907' UNION
SELECT '1972-08-31 03:09:13.227', '2008-06-30 17:39:45.430' UNION
SELECT '1984-02-29 00:42:23.113', '2005-10-01 01:58:43.550'
SELECT
dYears =
DateDiff(yy, Date1, Date2) -
CASE WHEN DateAdd(yy, DateDiff(yy, Date1, Date2), Date1) > Date2 THEN 1 ELSE 0 END,
dMonths = (
DateDiff(mm, Date1, Date2) -
CASE WHEN DateAdd(mm, DateDiff(mm, Date1, Date2), Date1) > Date2 THEN 1 ELSE 0 END
) % 12,
dDays =
DateDiff(dd,
DateAdd(mm, (
DateDiff(mm, Date1, Date2)
- CASE WHEN DateAdd(mm, DateDiff(mm, Date1, Date2), Date1) > Date2 THEN 1 ELSE 0 END
) % 12,
DateAdd(yy,
DateDiff(yy, Date1, Date2) -
CASE WHEN DateAdd(yy, DateDiff(yy, Date1, Date2), Date1) > Date2 THEN 1 ELSE 0 END
, Date1
)
) , Date2
)
FROM #BDates
SELECT
dYears = Years,
dMonths = Months,
dDays = DateDiff(dd, DateAdd(mm, Months, DateAdd(yy, Years, Date1)), Date2)
FROM (
SELECT
Date1, Date2,
Years = DateDiff(yy, Date1, Date2)
- CASE WHEN DateAdd(yy, DateDiff(yy, Date1, Date2), Date1) > Date2 THEN 1 ELSE 0 END,
Months = (
DateDiff(mm, Date1, Date2)
- CASE WHEN DateAdd(mm, DateDiff(mm, Date1, Date2), Date1) > Date2 THEN 1 ELSE 0 END
) % 12
FROM #BDates
)
DateDiff(yy, Date1, Date2)
=
Datepart(yy, Date2) - DatePart(yy, Date1)