الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج جديد لتحويل الهجري الى ميلادي

مغلق
بدأه ابوخلف في 8 ديسمبر 2003 · 4 رد · 856 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

التاريخ الهجري المدخل h_date CHAR

التاريخ الميلادي الناتج gdate CHAR

يتم ادخال التاريخ الهجري باي شكل

لفصل السنة عن بقية التاريخ

PROCEDURE HDATE_YEAR (H_YEAR OUT NUMBER) IS

BEGIN

SELECT TO_NUMBER(DECODE(LENGTH(DECODE(LENGTH(SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1,

4)),1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1))+1, 4),

SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4))),

4, DECODE(LENGTH(SUBSTR(:H_DATE,

DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0,INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),

1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1))+1, 4),

SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),

2, DECODE(LENGTH(SUBSTR(:H_DATE, 1,

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)), 1,

'0'||SUBSTR(:H_DATE, 1,

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),

2, SUBSTR(:H_DATE, 1,

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),

SUBSTR(:H_DATE, 1,

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)),

DECODE(LENGTH(SUBSTR(:H_DATE,

DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0,INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),

1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1))+1, 4),

SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'),0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'),0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'),0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1,

4)))) INTO H_YEAR FROM DUAL;

END;

لفصل الشهر عن التاريخ

PROCEDURE HDATE_MONTH (H_MONTH OUT NUMBER) IS

MONTH_NAME VARCHAR2(20);

BEGIN

SELECT DECODE(LENGTH(SUBSTR(:H_DATE,

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1,

(DECODE(INSTR(:H_DATE, '/',

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-',

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/',

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))-DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/')))-1)),

1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1,

(DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))-DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/')))-1),

2, SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1,

(DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1))-DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/')))-1),

SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1,

(DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0,INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),INSTR(:H_DATE, '/'))+1))-

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/')))-1)) INTO MONTH_NAME FROM DUAL;

IF LENGTH(MONTH_NAME)>2 THEN

SELECT TO_NUMBER(DECODE(MONTH_NAME

,'محرم',1

,'صفر',2

,'ربيع الأول',3

,'ربيع الثاني',4

,'جمادى الأولى',5

,'جمادى الثانية',6

,'رجب',7

,'شعبان',8

,'رمضان',9

,'شوال',10

,'ذو القعدة',11

,'ذو الحجة',11,0))INTO H_MONTH FROM DUAL;

ELSE

H_MONTH:=TO_NUMBER(MONTH_NAME);

END IF;

END;

لفصل اليوم عن التاريخ

PROCEDURE HDATE_DAY (H_DAY OUT NUMBER)IS

BEGIN

SELECT

DECODE(LENGTH(DECODE(LENGTH(SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0,INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)),

1,'0'||SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'),0,INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),

2,SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),

SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1))),

2,DECODE(LENGTH(SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))-1)), 1,

'0'||SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'),0,INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))-1),

2, SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'),0,INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))-1),

SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))-1)),

4, DECODE(LENGTH(SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),

INSTR(:H_DATE, '/'))+1))+1, 4)),

1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'),0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,

INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4),

SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/',

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

0, INSTR(:H_DATE, '-',

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),

INSTR(:H_DATE, '/',

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),

DECODE(LENGTH(SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)), 1,

'0'||SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),

2,SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),

SUBSTR(:H_DATE,1,

DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1))) INTO H_DAY FROM DUAL;

END;

PROCEDURE HDATE_TO_GDATE IS

H_DAY NUMBER(2);

H_MONTH NUMBER(2);

H_YEAR NUMBER(4);

I_LOOP NUMBER:=0;

HY NUMBER;

FGDATE DATE;

begin

FGDATE:=TO_DATE('14-JUL-0622','DD-MON-YYYY');

HDATE_DAY(H_DAY);

HDATE_MONTH(H_MONTH);

HDATE_YEAR(H_YEAR);

H_YEAR:=H_YEAR-1;

H_MONTH:=H_MONTH-1;

FOR I IN 1..H_YEAR LOOP

HY:=TRUNC(I/30)*30;

IF (I-HY) IN (2,5,7,10,13,16,18,21,24,26,29) THEN

I_LOOP:=I_LOOP+355;

ELSE

I_LOOP:=I_LOOP+354;

END IF;

END LOOP;

FOR J IN 1..H_MONTH LOOP

IF J IN (1,3,5,7,9,11) THEN

I_LOOP:=I_LOOP+30;

END IF;

IF J IN(2,4,6,8,10) THEN

I_LOOP:=I_LOOP+29;

END IF;

HY:=TRUNC(H_YEAR/30)*30;

IF J=12 AND (H_YEAR-HY) IN (2,5,7,10,13,16,18,21,24,26,29) THEN

I_LOOP:=I_LOOP+30;

ELSIF J=12 AND (H_YEAR-HY) NOT IN (2,5,7,10,13,16,18,21,24,26,29) THEN

I_LOOP:=I_LOOP+29;

END IF;

END LOOP;

I_LOOP:=I_LOOP+H_DAY;

FGDATE:=FGDATE+I_LOOP;

:GDATE:=TO_CHAR(FGDATE,'DD-MON-YYYY');

END;

وتتم المناداة عن طريق كتابة اسم البروسيدجر HDATE_TO_GDATE في WHEN_BUTTON_PRESSED

تم تعديل هذه المشاركة بواسطة ابوخلف في 8 ديسمبر 2003 في 17:03

#2

يعطيك العافية ابو خلف

والله هذه المشاركات التي نحتاج اليه !!!!!!!!!

وشكرا

علي احمد

مبرمج اوراكل

aaab2000@hotmail.com

#3

الأخ المكرم ابو خلف اشكرك على هذا المجهود الطيب

لدي بعض الملاحظات لقد قمت باختبار دقة التاريخ حسب تقويم ام القرى ووجدت ان بعض الأشهر تزيد بيوم واحد او تكون مضبوطه مثلا شهر صفر لهام 1425 عدده 29 يوم وفي عام 1426 تكون 29 يوم فقط وعندما اختبرت البروسيجر الخاص بكم وجدته في عام 1425 مضبوط في عام 1426 جعل شهر صفر 30 يوم مما يجعله غير متطابق مع تقويم ام القرى على فكرة مشكلة ام القرى مشكلة عامة وعلىفكرة لآ تعتمد على الكلندر الهجري الموجود في الوندوز لآن تقوم ام القرى مختلف عنه بيوم واحد خاصة في شهر صفر من كل عام تجده مضبوط والسنة اللي بعدها تجده يختلف بيوم واحد ولمطابقة التاريخ الميلادي بتقويم ام القرى انصحك بدخول موقع مدينة الملك عبدالعزيز للعلوم والتقنية

واشكرك اخي ابو خلف على جهدك الجبار للسعي في حل هذه المشكلة

#4

الأخ المكرم ابو خلف اشكرك على هذا المجهود الطيب

لدي بعض الملاحظات لقد قمت باختبار دقة التاريخ حسب تقويم ام القرى ووجدت ان بعض الأشهر تزيد بيوم واحد او تكون مضبوطه مثلا شهر صفر لهام 1425 عدده 29 يوم وفي عام 1426 تكون 29 يوم فقط وعندما اختبرت البروسيجر الخاص بكم وجدته في عام 1425 مضبوط في عام 1426 جعل شهر صفر 30 يوم مما يجعله غير متطابق مع تقويم ام القرى على فكرة مشكلة ام القرى مشكلة عامة وعلىفكرة لآ تعتمد على الكلندر الهجري الموجود في الوندوز لآن تقوم ام القرى مختلف عنه بيوم واحد خاصة في شهر صفر من كل عام تجده مضبوط والسنة اللي بعدها تجده يختلف بيوم واحد ولمطابقة التاريخ الميلادي بتقويم ام القرى انصحك بدخول موقع مدينة الملك عبدالعزيز للعلوم والتقنية

واشكرك اخي ابو خلف على جهدك الجبار للسعي في حل هذه المشكلة

#5

الاخ الكريم ابو خلف ...تحيه طيبه الى مجهودك الجبار ...

والحمد لله رب العالمين ... ان انت معانا في المنتدي ...والصراحة انت من الناس

الا الواحد لابذ ان يحيه ويشكره ...

وان شاء الله الى الامام ايه الاخ الكريم...

اخوك حسين عبدالله

هذا الموضوع مغلق.

مواضيع مشابهة