بتاريخ: 17 سبتمبر 201411 سنة comment_254928 السلام عليكم ورحمة الله 1- مازلت ابحث عن طريقه لتحويل التاريخ الهجري إلى ميلادي. 2- إذا في Function تحسب العمر عندما يكون التاريخ المدخل هجري. ارجو مساعدتكم تقديم بلاغ
بتاريخ: 18 سبتمبر 201411 سنة comment_254982 1- غير الـ nls_parameter وانت بتحول2- اظنها هي هي الي بتحسب لو التاريخ ميلادي , ومتهيألي انت سالت عليها قبل كدهاو في حد غيرك سأل قريب وحد من المشرفين رد عليه تقديم بلاغ
بتاريخ: 18 سبتمبر 201411 سنة comment_254986 السلام عليكم انشيء الـ Package التاليه على الداتابيز: CREATE OR REPLACE PACKAGE convert_dates_pkg IS FUNCTION gregorian_date (gregorian_date DATE) RETURN VARCHAR2; FUNCTION hijra_date (hijra_date VARCHAR2) RETURN DATE; END; / CREATE OR REPLACE PACKAGE BODY convert_dates_pkg IS FUNCTION gregorian_date (gregorian_date DATE) RETURN VARCHAR2 IS date_to_convert DATE; hijri_year VARCHAR2 (4); month_map VARCHAR2 (12); start_date DATE; counter NUMBER; last_month NUMBER; nodays NUMBER; BEGIN date_to_convert := TO_DATE (TO_CHAR (gregorian_date, 'DD-MM-YYYY'), 'DD-MM-YYYY'); SELECT yearh, monthmap, start_date INTO hijri_year, month_map, start_date FROM gen_hijri_map WHERE yearh = (SELECT MAX (yearh) FROM gen_hijri_map WHERE start_date <= date_to_convert); FOR counter IN 1 .. 12 LOOP last_month := counter; IF SUBSTR (month_map, counter, 1) = '1' THEN nodays := 30; ELSE nodays := 29; END IF; start_date := start_date + nodays; IF date_to_convert < start_date THEN EXIT; END IF; END LOOP; RETURN ( LPAD (TO_CHAR (nodays - (start_date - date_to_convert) + 1), 2, '0' ) || '-' || LPAD (last_month, 2, '0') || '-' || hijri_year ); END gregorian_date; FUNCTION hijra_date (hijra_date VARCHAR2) RETURN DATE IS hijri_year NUMBER; hijri_month NUMBER; hijri_day NUMBER; startdate DATE; month_map VARCHAR2 (12); counter NUMBER; nodays NUMBER; BEGIN hijri_day := TO_NUMBER (SUBSTR (hijra_date, 1, 2)); hijri_month := TO_NUMBER (SUBSTR (hijra_date, 4, 2)); hijri_year := TO_NUMBER (SUBSTR (hijra_date, 7, 4)); -- CHECK IF DATE IS VALID FIRST IF LENGTH (hijra_date) <> 10 THEN raise_application_error ('-20000', 'Not Valid Date Length'); END IF; BEGIN SELECT start_date, monthmap INTO startdate, month_map FROM gen_hijri_map WHERE yearh = hijri_year; EXCEPTION WHEN NO_DATA_FOUND THEN raise_application_error ('-20001', 'Not Valid Date Year'); END; IF hijri_month < 1 OR hijri_month > 12 THEN raise_application_error ('-20002', 'Not Valid Date Month'); END IF; IF hijri_day > 30 THEN raise_application_error ('-20003', 'Not Valid Date Day>30'); ELSIF hijri_day = 30 THEN IF SUBSTR (month_map, hijri_month, 1) <> '1' THEN raise_application_error ('-20004', 'Not Valid Date Day'); END IF; END IF; -- DATE IS VALID OK, CONVERT TO GREGORIAN DATE FOR counter IN 1 .. hijri_month LOOP IF SUBSTR (month_map, counter, 1) = '1' THEN nodays := 30; ELSE nodays := 29; END IF; startdate := startdate + nodays; END LOOP; startdate := startdate - nodays; RETURN (startdate + hijri_day - 1); END hijra_date; END; / لعمل Test للكود: 1- لاستخراج التاريخ الهجري من الميلادي: SELECT convert_dates_pkg.gregorian_date (SYSDATE) hijra_date FROM DUAL 2- لاستخراج التاريخ الميلادي من الهجري: SELECT convert_dates_pkg.hijra_date ('23-11-1435') gregorian_date FROM DUAL وبالنسبة لحساب العمر: تم الرد سابقا على موضوعك بجملة Select لحساب العمر. ولكن ان اردت حساب العمر بالهجري بامكانك استخدام الـ Function السابق لتحويله الى ميلادي ومن ثم تمرير القيمة لحساب العمر كالتالي: SELECT empno, ename, TRUNC (MONTHS_BETWEEN (SYSDATE, dob) / 12) YEAR, TRUNC (MOD (MONTHS_BETWEEN (SYSDATE, dob), 12)) MONTH, TRUNC ( SYSDATE - ADD_MONTHS (dob, TRUNC (MONTHS_BETWEEN (SYSDATE, dob) / 12) * 12 + TRUNC (MOD (MONTHS_BETWEEN (SYSDATE, dob), 12)) ) ) DAY FROM (SELECT convert_dates_pkg.hijra_date ('17-04-1405') dob, empno, ename FROM emp WHERE empno = 7369); بالتوفيق. تقديم بلاغ
بتاريخ: 29 أكتوبر 201411 سنة comment_256204 السلام عليكم انشيء الـ Package التاليه على الداتابيز: CREATE OR REPLACE PACKAGE convert_dates_pkg IS FUNCTION gregorian_date (gregorian_date DATE) RETURN VARCHAR2; FUNCTION hijra_date (hijra_date VARCHAR2) RETURN DATE; END; / CREATE OR REPLACE PACKAGE BODY convert_dates_pkg IS FUNCTION gregorian_date (gregorian_date DATE) RETURN VARCHAR2 IS date_to_convert DATE; hijri_year VARCHAR2 (4); month_map VARCHAR2 (12); start_date DATE; counter NUMBER; last_month NUMBER; nodays NUMBER; BEGIN date_to_convert := TO_DATE (TO_CHAR (gregorian_date, 'DD-MM-YYYY'), 'DD-MM-YYYY'); SELECT yearh, monthmap, start_date INTO hijri_year, month_map, start_date FROM gen_hijri_map WHERE yearh = (SELECT MAX (yearh) FROM gen_hijri_map WHERE start_date <= date_to_convert); FOR counter IN 1 .. 12 LOOP last_month := counter; IF SUBSTR (month_map, counter, 1) = '1' THEN nodays := 30; ELSE nodays := 29; END IF; start_date := start_date + nodays; IF date_to_convert < start_date THEN EXIT; END IF; END LOOP; RETURN ( LPAD (TO_CHAR (nodays - (start_date - date_to_convert) + 1), 2, '0' ) || '-' || LPAD (last_month, 2, '0') || '-' || hijri_year ); END gregorian_date; FUNCTION hijra_date (hijra_date VARCHAR2) RETURN DATE IS hijri_year NUMBER; hijri_month NUMBER; hijri_day NUMBER; startdate DATE; month_map VARCHAR2 (12); counter NUMBER; nodays NUMBER; BEGIN hijri_day := TO_NUMBER (SUBSTR (hijra_date, 1, 2)); hijri_month := TO_NUMBER (SUBSTR (hijra_date, 4, 2)); hijri_year := TO_NUMBER (SUBSTR (hijra_date, 7, 4)); -- CHECK IF DATE IS VALID FIRST IF LENGTH (hijra_date) <> 10 THEN raise_application_error ('-20000', 'Not Valid Date Length'); END IF; BEGIN SELECT start_date, monthmap INTO startdate, month_map FROM gen_hijri_map WHERE yearh = hijri_year; EXCEPTION WHEN NO_DATA_FOUND THEN raise_application_error ('-20001', 'Not Valid Date Year'); END; IF hijri_month < 1 OR hijri_month > 12 THEN raise_application_error ('-20002', 'Not Valid Date Month'); END IF; IF hijri_day > 30 THEN raise_application_error ('-20003', 'Not Valid Date Day>30'); ELSIF hijri_day = 30 THEN IF SUBSTR (month_map, hijri_month, 1) <> '1' THEN raise_application_error ('-20004', 'Not Valid Date Day'); END IF; END IF; -- DATE IS VALID OK, CONVERT TO GREGORIAN DATE FOR counter IN 1 .. hijri_month LOOP IF SUBSTR (month_map, counter, 1) = '1' THEN nodays := 30; ELSE nodays := 29; END IF; startdate := startdate + nodays; END LOOP; startdate := startdate - nodays; RETURN (startdate + hijri_day - 1); END hijra_date; END; / لعمل Test للكود: 1- لاستخراج التاريخ الهجري من الميلادي: SELECT convert_dates_pkg.gregorian_date (SYSDATE) hijra_date FROM DUAL 2- لاستخراج التاريخ الميلادي من الهجري: SELECT convert_dates_pkg.hijra_date ('23-11-1435') gregorian_date FROM DUAL وبالنسبة لحساب العمر: تم الرد سابقا على موضوعك بجملة Select لحساب العمر. ولكن ان اردت حساب العمر بالهجري بامكانك استخدام الـ Function السابق لتحويله الى ميلادي ومن ثم تمرير القيمة لحساب العمر كالتالي: SELECT empno, ename, TRUNC (MONTHS_BETWEEN (SYSDATE, dob) / 12) YEAR, TRUNC (MOD (MONTHS_BETWEEN (SYSDATE, dob), 12)) MONTH, TRUNC ( SYSDATE - ADD_MONTHS (dob, TRUNC (MONTHS_BETWEEN (SYSDATE, dob) / 12) * 12 + TRUNC (MOD (MONTHS_BETWEEN (SYSDATE, dob), 12)) ) ) DAY FROM (SELECT convert_dates_pkg.hijra_date ('17-04-1405') dob, empno, ename FROM emp WHERE empno = 7369); بالتوفيق. الأخ الفاضل أين الجداول المشار اليها في ال package وما هي البيانات التي سوف تدخل فيها مع جزيل الشكر تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.