2010-06-10 20 views
17

मैं अपने ओरेकल फ़ंक्शन में जन्म तिथि से वर्तमान आयु की गणना करना चाहता हूं।जन्म की तारीख से आजकल ओरेकल आयु गणना और आज

मैं जो उपयोग कर रहा हूं वह (Today-Dob)/30/12 है, लेकिन यह ठीक नहीं है क्योंकि कुछ महीनों में 31 दिन हैं।

मुझे अधिकतम सटीकता के साथ सही उम्र प्राप्त करने की आवश्यकता है। मैं उसे कैसे कर सकता हूँ?

+0

इस पोस्ट पर एक नज़र डालें, मुझे लगता है कि आपको क्या चाहिए है: http://stackoverflow.com/questions/43819/oracle -equivalent-to-sql-server-sybase-datediff – Jay

+1

बस कुछ pedantic टिप्पणियां। जब हम "उम्र" कहते हैं तो संभवत: शब्द * मतलब * के बारे में अधिक सावधानी से सोचने का एक अच्छा विचार है। आम तौर पर, जब कोई "उम्र" कहता है, तो वे * वास्तव में * मतलब "* कितने जन्मदिन की सालगिरह बीत चुके हैं *"। वैज्ञानिक रूप से, यदि हम वर्षों में दो लोगों की उम्र व्यक्त करते हैं, तो हम परिशुद्धता के बावजूद पूरी तरह तुलना नहीं कर सकते हैं, क्योंकि उनकी * वास्तविक आयु * उनके जन्म के आधार पर अलग होगी - उदा। वे एक लीप वर्ष में पैदा हुए थे; तब से कितने लीप सेकंड जोड़े/घटाए गए हैं; क्या वे सितंबर 1752 से पहले पैदा हुए थे? (1/2) –

+0

(2/2) यह इस बात पर निर्भर करता है कि वास्तव में सवाल क्या है - यानी "इनमें से कौन सा दो लोगों का सबसे लंबा रहता है" का उत्तर उस समय की इकाई का उपयोग करके किया जाना चाहिए जो संकेतक रूप से परिवर्तित नहीं होता है (उदाहरण के लिए दिन, या सेकंड)। "क्या इस व्यक्ति ने अपना 18 वां जन्मदिन पारित किया है" एक अलग सवाल है, जो मैं कहूंगा कि "उम्र" के अधिकांश लोगों का क्या मतलब है। –

उत्तर

33
SQL> select trunc(months_between(sysdate,dob)/12) year, 
    2   trunc(mod(months_between(sysdate,dob),12)) month, 
    3   trunc(sysdate-add_months(dob,trunc(months_between(sysdate,dob)/12)*12+trunc(mod(months_between(sysdate,dob),12)))) day 
    4 from (Select to_date('15122000','DDMMYYYY') dob from dual); 

     YEAR  MONTH  DAY 
---------- ---------- ---------- 
     9   5   26 

SQL> 
2

और किसी भी गणित और नंबर का उपयोग कर (हालांकि वहाँ उस के साथ कुछ भी गलत नहीं है) के बिना एक विकल्प:

SQL> with some_birthdays as 
    2 (select date '1968-06-09' d from dual union all 
    3 select date '1970-06-10' from dual union all 
    4 select date '1972-06-11' from dual union all 
    5 select date '1974-12-11' from dual union all 
    6 select date '1976-09-17' from dual 
    7 ) 
    8 select trunc(sysdate) today 
    9  , d birth_date 
10  , extract(year from numtoyminterval(months_between(trunc(sysdate),d),'month')) age 
11 from some_birthdays 
12/

TODAY    BIRTH_DATE     AGE 
------------------- ------------------- ---------- 
10-06-2010 00:00:00 09-06-1968 00:00:00   42 
10-06-2010 00:00:00 10-06-1970 00:00:00   40 
10-06-2010 00:00:00 11-06-1972 00:00:00   37 
10-06-2010 00:00:00 11-12-1974 00:00:00   35 
10-06-2010 00:00:00 17-09-1976 00:00:00   33 

5 rows selected. 
13

व्यापार तर्क के लिए मैं आमतौर पर एक दशमलव संख्या (वर्षों में) को खोजने के लिए उपयोगी है:

select months_between(TRUNC(sysdate), 
         to_date('15-Dec-2000','DD-MON-YYYY') 
        )/12 
as age from dual; 

     AGE 
---------- 
9.48924731 
+0

AskTOM (कॉनर मैकडॉनल्ड्स) का कहना है कि यह बहुत कम मामलों में विफल रहता है: https://asktom.oracle.com/pls/एपेक्स/एफ? पी = 100: 11 ::: नहीं: आरपी: पी 11_QUESTION_ID: 9531934000346471628 इस की सिफारिश करता है: trunc ((to_number (to_char (अब, 'YYYYMMDD')) - to_number (to_char (जन्म, 'YYYYMMDD '))/10000) –

+0

हाय @ राउलमोरेनो, वह सरल सूत्र वास्तव में बहुत कम परिशुद्धता में परिणाम देता है। यह लेख केवल पूर्णांक वर्षों में उम्र की गणना करने के बारे में है। कॉनर खुद कहता है "यह एक उचित अनुमान है, लेकिन फिर भी ... एक अनुमान"। मेरा एल्गोरिदम अधिक सटीक है, और उस लिंक में व्यक्त की गई मूल समस्या से पीड़ित नहीं है (365 तक दिनों की विभाजित संख्या अक्सर स्पष्ट कारणों से गलत होगी)। –

+0

ओह! क्षमा करें, मैंने नहीं देखा कि वह दशमलव चाहता था। मैं उम्र, असली, सालों में, लीप साल, आदि खाते में रखना चाहता था।और यह एकमात्र ऐसा है जो इसे हमेशा सही लगता है (और यह वह नहीं है जो 365 तक विभाजित होता है)। –

2

या इसके बारे में कैसे?

with some_birthdays as 
( 
    select date '1968-06-09' d from dual union all 
    select date '1970-06-10' from dual union all 
    select date '1972-06-11' from dual union all 
    select date '1974-12-11' from dual union all 
    select date '1976-09-17' from dual 
) 
select trunc(sysdate) today 
, d birth_date 
, floor(months_between(trunc(sysdate),d)/12) age 
from some_birthdays; 
2

यह वही है किसी और को सुझाव दिया है की तुलना में काफी आसान लगता है

select sysdate-to_date('30-jul-1977') from dual; 
+0

यह गलत है क्योंकि यह एक स्ट्रिंग को एक तिथि में परिवर्तित कर रहा है, जो कि बहुत गलत हो सकता है। – Ben

-3

का चयन करें (SYSDATE-जन्म तिथि)/365 से दोहरी

2
SELECT 
TRUNC((SYSDATE - TO_DATE(DOB, 'YYYY-MM-DD'))/ 365.25) AS AGE_TODAY FROM DUAL; 

"आयु" यह आसान और सीधे करने के लिए है बिंदु।

1

उम्र व्यक्ति की (पूर्ण वर्ष):

SELECT 
    TRUNC(months_between(sysdate, per.DATE_OF_BIRTH)/12) AS "Age" 
FROM PD_PERSONS per 
0
SQL>select to_char(to_date('19-11-2017','dd-mm-yyyy'),'yyyy') - to_char(to_date('10-07-1986','dd-mm-yyyy'),'yyyy') year, 
to_char(to_date('19-11-2017','dd-mm-yyyy'),'mm') - to_char(to_date('10-07-1986','dd-mm-yyyy'),'mm') month, 
to_char(to_date('19-11-2017','dd-mm-yyyy'),'dd') - to_char(to_date('10-07-1986','dd-mm-yyyy'),'dd') day from dual; 

     YEAR  MONTH  DAY 
---------- ---------- ---------- 
     31   4   9 
संबंधित मुद्दे