March 14, 2008 at 10:18 am
The following formula could be more accurate
(DATEDIFF(yy, @dob, getdate()) - CASE
WHEN DATEPART(m, @dob) < DATEPART(m, getdate()) THEN 0
WHEN DATEPART(m, @dob) = DATEPART(m, getdate()) AND DATEPART(d, @dob) <= DATEPART(d, getdate()) THEN 0
ELSE 1 END) end
Hank Cao
March 14, 2008 at 10:34 am
Using my DOB, None of the 3 technically gave the correct answer.
WHen I ran it my DOB was 4 days in the future
Setting my DOB to 2 months, 4 days in the future, this statement was the ONLY one that was correct:
FLOOR(CONVERT(decimal(9, 2), DATEDIFF(d, @DateOfBirth, GETDATE())) / 365.0)
March 16, 2008 at 1:39 am
I eliminated numbers 1 and 3 in my head since it didn't calculate my age correctly, and picked 2. Oh well.
Anyway, it looks like number 3 should be:
DATEDIFF(yy, @DateOfBirth, getdate()) - CASE WHEN DATEPART(m, @DateOfBirth) >= DATEPART(m, getdate()) AND DATEPART(d, @DateOfBirth) > DATEPART(d, getdate()) THEN 1 ELSE 0 END
(changed the >= on the day comparison to > since most people count their birthday as the day they get older, and not the day after.)
March 17, 2008 at 2:11 pm
Indeed, the 0 and the 1 should be reversed. However, if you plug in a birthdate that occurs on the current Month/Day, it is incorrect.
March 26, 2008 at 4:56 am
Hello,
The "AND" in de case is clearly wrong because if the day of the BirthDay is inferior to the one obtain in the GETDATE() it will always return 0.
CASE WHEN DATEPART(m, BirthDate) >= DATEPART(m, GETDATE()) AND DATEPART(d, BirthDate) >= DATEPART(d, GETDATE()) THEN 0 ELSE 1 END
March 31, 2008 at 10:38 pm
I agree with others here. Using my birth date the only one that gave me the correct answer was the second one and my birthday is 7 months away.
I want my point! 🙂
Nicole Bowman
Nothing is forever.
April 1, 2008 at 9:27 am
The second answer is the most accurate of the three; however, it does not account for leap years. The third answer would be the correct answer if the 1 and 0 were switched around.
April 10, 2008 at 4:30 am
the second one is correct. give me my point.
April 10, 2008 at 7:58 am
aarif.pd (4/10/2008)
the second one is correct. give me my point.
No, it is not. 🙂
April 10, 2008 at 6:26 pm
Goodness, this one's gone on, hasn't it? And now I'm in it cuz of the row-size QOTD that had a naive age calculation thrown in.
Anyway, before reading through all 19 pages, I coded this:
Declare @DOB smallDatetime
Declare @Today smallDatetime
set @DoB = '02/29/2004'
set @Today = '2/29/08'
select @dob as Dob
,@today as Today
,year(@today)-year(@dob)
- casewhen month(@today) < month(@dob)
or (month(@today) = month(@dob) and day(@today) < day(@dob))
then 1
else 0
end
as Age
It turns out that it's pretty similar to some other solutions agreed to be correct, except that I used the functions "year()", "month()", and "day()" rather than "Datepart()".
Can someone who knows tell me why Datepart() would be preferrable? I like the distinct functions for readability.
April 11, 2008 at 1:14 am
john.arnott (4/10/2008)
Can someone who knows tell me why Datepart() would be preferrable? I like the distinct functions for readability.
Hi John,
YEAR(...) is synonym for DATEPART(year, ...); similar for DAY and MONTH. From a technical point of view, there's no preference.
The only thing left is readability. Some, like you, prefer the shorter versions because they are shorter and hence easier to understand. Others prefer DATEPART because you can also use that to expose dateparts that have no synonym (like, for instance, week, minute, quarter) and they consider it more consistent to use the same function in all cases.
All in all, just a matter of personal preference. Though I'd recommend you to follow shop standards if there are any.
May 31, 2008 at 6:52 am
Love all the trick questions in the QOD stuff - I never even looked past the first one as even though it may not always give the correct birthdate in English/American terms, it could be adjusted to more readably do so by flooring the other values out of the year! Hand up, I got it wrong, but then IMO not a great question since the actual "correct" answer doesn't work either.
July 3, 2008 at 7:31 pm
Declare @d smalldatetime
set @d = '1957/7/5'
Select DATEDIFF(yy, @d, GETDATE()) -
CASE WHEN
DATEPART(m, @d) < DATEPART(m, GETDATE())
OR (
DATEPART(m, @d) = DATEPART(m, GETDATE())
AND
DATEPART(d, @d) <= DATEPART(d, GETDATE())
) THEN 0 ELSE 1 END
July 4, 2008 at 2:42 am
Luc Philie (7/3/2008)
Declare @d smalldatetimeset @d = '1957/7/5'
Select DATEDIFF(yy, @d, GETDATE()) -
CASE WHEN
DATEPART(m, @d) < DATEPART(m, GETDATE())
OR (
DATEPART(m, @d) = DATEPART(m, GETDATE())
AND
DATEPART(d, @d) <= DATEPART(d, GETDATE())
) THEN 0 ELSE 1 END
And your point is...?
Derek
July 10, 2008 at 3:22 am
declare @DateOfBirth datetime
declare @result as varchar
set @DateOfBirth='1983-07-11'
select @result = (DATEDIFF(yy, @DateOfBirth, GETDATE()) -
case when Convert(Datetime,Convert(varchar,DATEPART(yy, GETDATE())) + '-' + Convert(varchar,DATEPART(m, @DateOfBirth))+ '-'+ Convert(varchar,DATEPART(d, @DateOfBirth)))
<=GetDate() THEN 0 ELSE 1 END )
select @Result
Here is the correct query to retrieve exact age.
😎
MayurArt
Viewing 15 posts - 166 through 180 (of 189 total)
You must be logged in to reply to this topic. Login to reply