ADBLOCKを無効にする

ADBlockがサイトの一部のコンテンツをブロックしています

ADBlock errore
結果が見つかりました: 

質問

私はOracleの機能で生年月日から現在の年齢を計算したい。

私が使用しています何(Today-Dob)/30/12ですが、いくつかの数ヶ月は31日を持っているように、これは正確ではありません。

私は、最大の精度で正確な年齢を取得する必要があります。どうやってやるの?

溶液

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>

よろしければ、ご意見をお聞かせください

この記事は役に立ちましたか?正しく翻訳されていますか?

その他のヒント

ビジネスロジックのために、私は普通に有用である(年)進数を見つけます:

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

       AGE
----------
9.48924731

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

これは簡単で、まっすぐなポイントです。

そして、任意の算術演算と数字を使用せずに、代替(それと間違って何もありませんが):

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.

それともこれはどう?

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;

これは誰にも示唆しているものよりもかなり容易と思われる。

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

人の年齢(フル年間):

SELECT
  TRUNC(months_between(sysdate, per.DATE_OF_BIRTH) / 12) AS "Age"
FROM PD_PERSONS per

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

あなたが試すことができます。

SELECT ROUND((SYSDATE - TO_DATE('12-MAY-16'))/365.25, 5) AS AGE from DUAL;

あなたが望むように多くの小数点以下の桁数として表示するようにROUNDを設定することができます。

前述のように10進形式で日付を配置するには、など、年齢層の計算に役立ちます。

これは単なる不自然な例です。現実世界のシナリオでは、TO_DATEを使用して日付を文字列に変換されません。

日付形式で誕生日を持っている場合は、あなたが安全に二つの日付を引くことができます。

このコマンドを実行し、あなたがJune 4, 1996に生まれ、誰かの(年のみ、固定数の数)年齢を持つようにしたいと仮定します:

SELECT TRUNC(TO_NUMBER(SYSDATE - TO_DATE('04-06-1996')) / 365.25) AS AGE FROM DUAL;

結果:(2019年5月28日に実行)

       AGE
----------
        22

説明:

あなたは法の下に試すことができ、

SELECT EXTRACT(YEAR FROM APP_SUBMITTED_DATE)-EXTRACT(YEAR FROM BIRTH_DATE) FROM SOME_TABLE;

これは、年を比較し、それに応じて年齢を与えるだろう。
またSYSDATEの代わりAPP_SUBMITTED_DATEを使用することができます。

よろしくます。

デュアル

から

を選択し(SYSDATE-DOB)/ 365 "年齢"