2014-12-19 5 views
7

की गणना करने के लिए फ़ंक्शन मैं एक फ़ंक्शन लिखने की कोशिश कर रहा हूं जहां मुझे getdate() के बजाय रिकॉर्ड डालने की तिथि के आधार पर आयु मिल सकती है। मैं उस उपयोगकर्ता को फ़िल्टर करना चाहता हूं जो पंजीकृत होने पर 18 साल से कम हो। यदि मैं इसे एक वर्ष के बाद पूछता हूं, तो उसे अभी भी उपयोगकर्ता को वर्तमान दिनांक की तुलना में रिकॉर्ड डालने की तारीख के आधार पर 17 के रूप में दिखाना चाहिए। मैंने यही लिखा है लेकिन यह अभी भी रिकॉर्ड डालने की तारीख की तुलना में वर्तमान तिथि के आधार पर उम्र दे रहा है। कोई सुझाव वास्तव में सहायक होगा। आपउम्र

--InputDate as DateOfBirth 
--InsertDate as date the record was inserted 

CREATE FUNCTION [dbo].[FindAge] (@InputDate int, @Insertdate datetime) 
RETURNS int 
AS 
BEGIN 
DECLARE @Age as Int 

DECLARE @d DATETIME 
SET @d = CONVERT(DATETIME, CONVERT(VARCHAR(8), @InputDate), 112) 

SELECT @Age=DATEDIFF(year, @d, @Insertdate) 
- CASE WHEN DATEADD(year, DATEDIFF(year, @d, @Insertdate), @d) <= GetDate() 
     THEN 0 ELSE 1 END  

RETURN @Age 
END 

---- Drop Obselete procs 
GO 

अद्यतन बाद बेकन बिट सुझाव की सराहना करते हैं और यह पूरी तरह से बाहर काम किया।

+0

यहां आप यहां जाएं: http://stackoverflow.com/questions/1572110/how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate – CodeLikeBeaker

+0

त्वरित नज़र के बाद, ऐसा लगता है * काम * करना चाहिए। शायद '@ इनपुटडेट' पैरामीटर में गलत मान है? –

+0

मेरा कोड पहले से ही गेटडेट पर आधारित आयु प्राप्त करता है लेकिन मुझे बनाई गई उम्र के आधार पर उम्र चाहिए और मैंने सोचा कि मैंने जो कोड पोस्ट किया है उसे इसे संभालना चाहिए, लेकिन फिर भी यह गेटेट() के आधार पर उम्र की गणना कर रहा है। – user2908229

उत्तर

5

सभी DATEDIFF() दिनांक घटकों से वर्षों को घटाना है। यह बहुत बेवकूफ है:

select datediff(yy,'2000-12-19','2014-01-01') --14 
select datediff(yy,'2000-12-19','2014-12-18') --14 
select datediff(yy,'2000-12-19','2014-12-19') --14 
select datediff(yy,'2000-12-19','2014-12-20') --14 
select datediff(yy,'2000-12-19','2014-12-31') --14 
select datediff(yy,'2000-12-19','2015-01-01') --15 
select datediff(yy,'2000-12-19','2015-12-31') --15 
select datediff(yy,'2000-12-19','2016-01-01') --16 
select datediff(yy,'2000-12-19','2016-12-31') --16 

साल 365.25 दिन लंबे या ऐसा ही कुछ होने के साथ एक वर्ष में घंटों की संख्या की गणना करें। यह व्यर्थता में एक अभ्यास है, और केवल की गारंटी देता है कि आप हर व्यक्ति के जन्मदिन के पास गलत होंगे।

आपकी सबसे अच्छी शर्त यह गणना करना है कि मनुष्य इसे कैसे करते हैं। अमेरिका में (और सबसे पश्चिमी देशों, मेरा मानना ​​है) यह साल के बीच का अंतर है, लेकिन जब आप अपने जन्मदिन पारित आप केवल चालू वर्ष गिनती:

declare @birthdate date = '2000-12-19'; 

declare @target date; 

SELECT DATEDIFF(yy, @birthdate, @target) 
     - CASE 
      WHEN (MONTH(@birthdate) > MONTH(@target)) 
       OR (
        MONTH(@birthdate) = MONTH(@target) 
        AND DAY(@birthdate) > DAY(@target) 
       ) 
      THEN 1 
      ELSE 0 
     END 

यहाँ मूल्यों है आप प्राप्त करेंगे:

set @target = '2014-01-01' --13 
set @target = '2014-12-18' --13 
set @target = '2014-12-19' --14 
set @target = '2014-12-20' --14 
set @target = '2014-12-31' --14 
set @target = '2015-01-01' --14 
set @target = '2015-12-31' --15 
set @target = '2016-01-01' --15 
set @target = '2016-12-31' --16 

अब तक की आयु की गणना करने के लिए @targetgetdate() बदलें।

यदि आपका क्षेत्र East Asian age reckoning का उपयोग करता है, तो आपको यह निर्धारित करने के लिए एक पूरी तरह से अलग विधि का उपयोग करने की आवश्यकता होगी कि एक व्यक्ति किस उम्र में है, क्योंकि उन्हें जन्म के दिन 1 वर्ष माना जाता है, और उनकी उम्र प्रत्येक फरवरी में बढ़ जाती है ।

+0

बेकन बिट्स बहुत बहुत धन्यवाद। यह पूरी तरह से काम किया। – user2908229

संबंधित मुद्दे