שאלה על גיל

yanivz9

New member
שאלה על גיל

אני בונה טופס שיש בו שלוש שדות שמרכיבות תאריך לידה מלא יום,חודש,שנה
אני רוצה להכניס את התאריך לידה לדטהבייס ואני
מתלבט באיזה פורמט להכניס אותו. אם לשרשר אותם כשדה אחד "BDATE" מסוג DATETIME
או שלוש שדות BDAY,BMONTH,BYEAR מסוג INT


כרגע יש לי בעיה עם האופציה של שלוש שדות מסוג INT כי כשאני מנסה לשלוף את הגיל דרך פונקציה הוא נותן לי גיל כוזב.

להלן השאילתא:

SELECT dbo.fAgeCalc(u.Bday+u.Bmonth+u.Byear,GETDATE()) as Age FROM USERS u

להלן הפונקציה:
ALTER function [dbo].[fAgeCalc](@DOB datetime,@Date datetime)
returns smallint
as
----------------------------------------------------
-- * Created By David Wiseman, Updated 03/11/2006
-- * http://www.wisesoft.co.uk
-- * This function calculates a persons age at a
-- * specified date from their date of birth.
-- * Usage:
-- * select dbo.fAgeCalc('1982-04-18',GetDate())
-- * select dbo.fAgeCalc('1982-04-18','2006-11-03')
----------------------------------------------------
begin
return (
select case when month(@DOB)>month(@Date) then datediff(yyyy,@DOB,@Date)-1
when month(@DOB)<month(@Date) then datediff(yyyy,@DOB,@Date)
when month(@DOB)=month(@Date) then
case when day(@DOB)>day(@Date)
then datediff(yyyy,@DOB,@Date)-1
else datediff(yyyy,@DOB,@Date) end
end)
end
 

כלליים

New member
לכאורא

בלי לבדוק היטב, כשאתה קורא לפונקציה עליך לשרשר את הערכים בפורמטים המקובלים כמו mm/dd/yyyy או yyyy-mm-dd ולא בפורמט dd/mm/yyyy.
 

pitoach

New member
אין מה לבדוק לעומק זו אכן הבעיה


אתה מחבר 3 מספרים INT של יום+חודש+שנה לפני שאתה מגיע בכלל לפונקציה. ואז מתייחס לתוצאה כאילו היא תאריך בתוך הפונקציה.
מה הקשר לתוצאה ולתאריך?

בתאריך 01/02/2012 מה שאתה מקבל זה מספר אחד בגודל 1+2+2012 = 2015
מה המשמעות של 2015 ?

אם כתבת פונקציה שמקבל תאריך אז אתה צריך להנכיס אליה תאריך

* דרך אגב לחישוב יום הולדת לא ממש צריך פונקציה וזו דרך לא נכונה אלא פשוט להריץ שאילתה נקייה כפי שאראה בעוד רגע

שים לב למשל שאתה מבצע בדיקות על חודש ואחר כך על יום אבל מה עם שעה ומה עם שניות ומה עם ...
הלוגיקה הזו אינה טובה והרבה יותר פשוט לבצע את השיטה הבא (ניתן לרשום אפילו יותר טוב אולי וזה רק דוגמה): מאפסים את התאריך הולדת לתאריך של יום ההולדת בשנה הנוכחית. ז"א אם יום הולדת האדם היה 1900 בחודש X ביום Y אז יום ההולדת שלו השנה יהיה ב 2012 בחודש X ביום Y

עתה כשיודעים מתי יום ההולדת שלו ניתן לבדוק בפעם אחת מייד אם התאריך היום הוא לפני יום ההולדת שלו השנה (ואז נחסיר 1 מהחישוב) או שהוא כבר היה השנה ולכן החישוב נכון

או בקוד ניתן בשאילתה פשוטה ללא פונקציה לבצע למשל:
case
when dateadd(year,datepart(year,@D2)-datepart(year,@D1),@D1) < @D2 then datediff(yyyy,@D1,@D2)
else datediff(yyyy,@D1,@D2) - 1
end

מקווה שזה ברור
 
למעלה