5

私は、ユーザーに生年月日を尋ねて年齢を計算する単純な PL/SQL ブロックに取り組んでいます。12 の変換で割った months_between を使用しましたが、置換変数の日付変換とユーザーからの日付入力に問題があります。v_birthday_year は、後で統合する必要があるコードの別の部分であるため、無視してください。

ユーザーが入力しなければならない形式、つまり 05-07-1980 または 06 Mar 1978 が受け入れられるかどうか、および入力したものから年齢を計算する方法がわかりません。

私の希望するプログラムは、ユーザーの生年月日をこの形式の DD-MON-YYYY で受け入れる PL/SQL プログラムを作成し、年齢を小数点以下 1 桁で計算することです。したがって、小数点以下1桁まで計算する必要があります。

これが私が持っているものですが、置換変数の入力でDOBに入力する形式と、小数点以下1桁の実際の計算がわかりません。どこが間違っているのか、それを修正する方法を見つけようとしているだけです。

SET SERVEROUTPUT ON
DECLARE
  --v_birthday_year         NUMBER(4)    := &v_birthday_year;
  v_dob                   DATE      := &v_dob 
  v_your_age              NUMBER(3, 1);
BEGIN
  v_your_age := TRUNC(MONTHS_BETWEEN(SYSDATE, v_dob))/12;  
  DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age);
END;
/
4

4 に答える 4

23

これらのいずれかを使用できます(純粋なSQL)

SELECT months_between(sysdate, user_birth_date) /12 FROM dual;

また

SELECT floor(months_between(sysdate, user_birth_date) /12) FROM  dual;

また

SELECT EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM user_birth_date) FROM dual

また

SELECT (sysdate - user_birth_date) / 365.242199 FROM dual

これが役立つことを願っています

于 2013-02-07T19:37:03.927 に答える
11

PL/SQLについて何かを学んでいない限り、他の人や私からのすべてのSQLの例を使用することをお勧めします。これが私が思いついたものです:

 DECLARE
  v_dob        DATE:= to_date('&v_dob', 'MM/DD/YYYY'); -- copy this line and you'll be fine
  v_your_age   NUMBER(3, 1);
BEGIN
  v_your_age := TRUNC(MONTHS_BETWEEN(SYSDATE, v_dob))/12;  
  DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age);
END;
/

I passed 01/01/2010. Got this in output: 

 Your age is 3.1

別の SQL の例:

SELECT empno, ename, hiredate
    , TRUNC(MONTHS_BETWEEN(sysdate, hiredate)/12) years_of_service  
 FROM scott.emp
/
于 2013-02-07T19:40:23.067 に答える