webentwicklung-frage-antwort-db.com.de

Oracle PL/SQL, Berechnen des Alters ab dem Geburtsdatum mithilfe der einfachen Substitutionsvariablen und months_between

Ich arbeite an einem einfachen PL/SQL-Block, der den Benutzer nach seinem Geburtsdatum fragt und sein Alter berechnet. Ich habe months_between dividiert durch 12 verwendet, habe jedoch Probleme mit der Datumskonvertierung und der Datumseingabe des Benutzers für die Substitutionsvariable. Bitte ignorieren Sie v_birthday_year, da dies ein weiterer Teil des Codes ist, den ich später integrieren muss.

Ich bin mir nicht sicher, welches Format der Benutzer eingeben muss, dh 05-07-1980 oder 06 Mrz 1978, das akzeptabel wäre, und wie man sein Alter anhand dessen berechnet, was er eingibt.

Mein gewünschtes Programm ist, ein PL/SQL-Programm zu schreiben, um das Geburtsdatum des Benutzers in diesem Format TT-MON-JJJJ zu akzeptieren, und das Alter mit 1 Dezimalstelle zu berechnen. Also muss es auch auf eine Dezimalstelle berechnet werden.

Hier ist, was ich habe, aber ich bin nicht sicher, welches Format das DOB bei der Eingabe der Substitutionsvariablen und der tatsächlichen Berechnung mit einer Dezimalstelle eingeben soll. Ich versuche nur zu sehen, wo ich falsch liege und wie ich das korrigiere.

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
MeachamRob

Alle SQL-Beispiele von anderen und mir sind wahrscheinlich besser zu verwenden, es sei denn, Sie lernen etwas über PL/SQL. Folgendes habe ich mir ausgedacht:

 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

Ein weiteres SQL-Beispiel:

SELECT empno, ename, hiredate
    , TRUNC(MONTHS_BETWEEN(sysdate, hiredate)/12) years_of_service  
 FROM scott.emp
/
9
Art

Sie können eines davon verwenden (reines SQL)

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

oder

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

oder

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

oder

SELECT (sysdate - user_birth_date) / 365.242199 FROM dual

Hoffe das wird helfen

23
Mohsen Heydari
select dob,sysdate,trunc(months_between(sysdate,dob)/12) as year,
   trunc(mod(months_between(sysdate,dob),12)) as month,
   trunc(sysdate - add_months(dob,((trunc(months_between(sysdate,dob)/12)*12) + trunc(mod(months_between(sysdate,dob),12))))) as day
   from emp;
0
rajesh
 Create or replace function getAge(birthday date) return number is
  v_your_age   NUMBER(3, 1);``
  BEGIN
  v_your_age := floor(MONTHS_BETWEEN(SYSDATE, birthday))/12;  
  return v_your_age;
  END;
   /

dann rufst du die funktion auf

BEGIN
DBMS_OUTPUT.PUT_LINE ('Your age is ' || getAge(to_date('10/10/2015','DD/MM/YYYY')));
end;
/
0
Raju