کاربرد تابع DATEDIFF در Query نویسی - قسمت دوم

سه شنبه 26 آبان 1394

در این مقاله با یک دیتابیس کوچک اما با پتانسیل، برای نوشتن Query آشنا میشویم

در ادامه قسمت اول این مقاله در این جلسه با Query های زیر و نکات آن آشنا شده

Query دوم :

چه اشخاصی در یک تاریخ خاص زنده بودن و چند ساله بودن ؟ 

SELECT
 FirstName,
 LastName,
 DATEDIFF(yy,DateOfBirth, '1/1/2001') AS Age
 FROM Person 
 WHERE 
 DateOfBirth <= '1/1/2001'
 AND (DateOfDeath IS NULL OR DateOfDeath >= '1/1/2001' )
 ORDER BY Age ASC

خب همون طور که مشاهده میکنید تاریخ تولد باید کوچکتر از تاریخ مورد نظر باشد و تاریخ فوت NULL باشد  یا بزرگتر از تاریخ موردنظر ما باشد

Query سوم :

سن زوج ها را در تاریخ ازدواجشون لیست کنید .

در این مثال و مثال هایی از این قبیل ما باید از Self Join استفاده کنیم تا بتوانیم از یک جدول Person هم اطلاعات عروس و هم اطلاعات داماد را استخراج کنیم

SELECT  CONVERT( VARCHAR(10), DateOfWedding,101) AS WeddingDate, 
    H.FirstName + ' ' +  H.LastName  AS Groom, 
    DATEDIFF(yy,H.DateOfBirth, Marriage.DateOfWedding) AS GroomAge,
    W.FirstName + ' ' + W.LastName  AS Bride,
    DATEDIFF(yy,W.DateOfBirth, Marriage.DateOfWedding) AS BrideAge
  FROM Marriage
    INNER JOIN Person H
      ON Marriage.HusbandID = H.personID
    INNER JOIN Person W
      ON Marriage.WifeID = W.personID
  ORDER BY DateOfWedding

 

Query چهارم :

چه اشخاصی پس از چند سال زندگی مشترک طلاق گرفته اند ؟

SELECT 
    Hubby.FirstName + ' ' + Hubby.LastName AS XHubby,
    Wife.FirstName + ' ' + Wife.LastName AS XWife,
	DateOfDivorce,
    DATEDIFF(yy, DateOfWedding, DateOfDivorce) AS YrsMarried
  FROM Person AS Hubby
    JOIN Marriage
      ON Hubby.PersonID = Marriage.HusbandID
    JOIN Person AS Wife
      ON Marriage.WifeID = WIfe.PersonID
  WHERE DateOfDivorce IS NOT NULL
  ORDER BY YrsMarried DESC

همانطور که مشاهده میکنید در مثال هایی که از Self Join استفاده میشود حتما باید برای جدول مورد نظر از اسم مستعار Alias استفاده کرد تا دسترسی های مختلفی به یک جدول داشته باشیم .

 

Query پنجم : 

لیست تمام اشخاص به همراه اسم والدین ( ممکن است برای همه اشخاص اطلاعات والدین در دسترس نباشد ) 

نکته ایی که در این مثال وجود دارد این است که اگر ما از INNER JOIN استفاده کنیم با توجه به شرایط گفته شده ممکن است نتوانیم اطلاعات تمام اشخاص را بازیابی کنیم ! (چرا ؟)

به همین دلیل باید با LEFT OUTER JOIN این مثال را انجام دهیم .

SELECT
 Person.PersonID,
 CONVERT(NVARCHAR(15), Person.DateofBirth,1) AS BirthDate, 
 Person.FirstName,
 Person.Gender,
 ISNULL(F.FirstName + ' ' + F.LastName, ' * unknown *') as Father, 
 ISNULL(M.FirstName + ' ' + M.LastName, ' * unknown *') as Mother
  FROM Person
     LEFT OUTER JOIN Person F
      ON Person.FatherID = F.PersonID
    LEFT OUTER JOIN Person M
      ON Person.MotherID = M.PersonID
  ORDER BY Person.DateOfBirth ASC

در این مثال از تابع ISNULL استفاده کردیم برای زمانی که اگر دیتایی برابر با NULL بود یک عبارت دلخواه به جای آن نمایش داده شود 

فرمت این تابع به این شکل است : 

 

در قسمت بعد با Query های پیشرفته تری آشنا خواهید شد از قبیل مواردی چون Group BY و Select های تو در تو 

 

فایل های ضمیمه

سروش صدر

نویسنده 4 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید