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;
/
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
/
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
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;
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;
/