الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

التحويل بين التواريخ

Featured Replies

بتاريخ:

السلام عليكم ورحمة الله

1- مازلت ابحث عن طريقه لتحويل التاريخ الهجري إلى ميلادي.

2- إذا في Function تحسب العمر عندما يكون التاريخ المدخل هجري.

 

ارجو مساعدتكم

بتاريخ:

1- غير الـ nls_parameter وانت بتحول
2- اظنها هي هي الي بتحسب لو التاريخ ميلادي , ومتهيألي انت سالت عليها قبل كده
او في حد غيرك سأل قريب وحد من المشرفين رد عليه

بتاريخ:

السلام عليكم

انشيء الـ 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);

 

 

بالتوفيق.

بتاريخ:

جزاك الله خير مهندس احمد 

  • بعد 1 شهر...
بتاريخ:

 

السلام عليكم

انشيء الـ 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 وما هي البيانات التي سوف تدخل فيها

مع جزيل الشكر

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.