2017-03-29 12 views
-1

私は、関数EXTRACTを使用して、このクエリで年のユーザーを取得しようとしている: 関数extract()は正しい結果を返しません

SELECT EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM contact.BIRTHDATE) AS CONTACT_YEARS 
FROM CONTACT contact 

が、いくつかの日付の

、たとえばため :contact.BIRTHDATE = '27 -AGO-40 '関数EXTRACT(YEAR FROM contact.BIRTHDATE)は2040を返し、クエリは機能しません。

また、to_date(contact.BIRTHDATE, 'dd/mm/yyyy') を使ってみましたが、日付形式は変更されません。

ありがとうございます!

+2

はよろしい*その誕生日が(これが問題であると仮定して)1940年に設定されている*はありますか?私は1950年にオラクルがピボットを持ち、2桁の日付は1950年から2049年と想定されることを思い起こさせるようです。 – paxdiablo

+0

'to_char(contact.BIRTHDATE、 'dd/mm/yyyy')'を試して、結果を確認してください。これにより、データに問題があることがわかります。また、 'to_date 'を日付列に適用することは意味をなさないことに注意してください。 – Aleksej

+0

私も試みBUIT結果である: -32 \t 27/08/2049 26/01/1964 17/07/1983 26/10/1980 18/10/1954 ... –

答えて

1

2桁の日付の年のコンポーネントのみを表示しています。通年を表示すると、日付の世紀が間違っている可能性があります。

また、かなりの年の差を取得するには何年差し引くよりも、あなたが使用して良いだろう。

TRUNC(MONTHS_BETWEEN(sysdate, birthdate)/12) 

Oracleのセットアップ

CREATE TABLE contact(BIRTHDATE DATE); 

INSERT INTO contact (birthdate) 
SELECT DATE '1977-03-29' FROM DUAL UNION ALL 
SELECT DATE '77-03-29' FROM DUAL UNION ALL 
SELECT DATE '1977-03-30' FROM DUAL; 

クエリ

SELECT TO_CHAR(birthdate, 'YYYY-MM-DD') AS full_year, 
     TO_CHAR(birthdate, 'YY-MM-DD') AS short_year, 
     EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM birthdate) AS age, 
     TRUNC(MONTHS_BETWEEN(sysdate, birthdate)/12) AS actual_age 
FROM contact; 

出力

FULL_YEAR SHORT_YEAR AGE ACTUAL_AGE 
---------- ---------- ---- ---------- 
1977-03-29 77-03-29  40   40 
0077-03-29 77-03-29 1940  1940 
1977-03-30 77-03-30  40   39 
関連する問題