الانتقال إلى المحتوى

طريقة الاستعلام عن التواريخ المتتالية فى جدول


Osama Soliman

Recommended Posts

السادة الافاضل / اعضاء المنتدى

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

 

فيما يلى استعلام لعرض التورايخ المتتالية داخل جدول مثال عرض الاجازات الواقعة فى ايام متتالية لكل موظف :

 

بفرض انشاء الجدول التالى :

 

CREATE TABLE vacations
(employee_id NUMBER, vac_date DATE);

ثم اضافة البيانات التالية اليه :

 

INSERT INTO vacations VALUES (15,to_date('2017/01/01','yyyy/mm/dd'))
​;INSERT INTO vacations VALUES (15,to_date('2017/01/02','yyyy/mm/dd'));
INSERT INTO vacations VALUES (15,to_date('2017/01/06','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/01/03','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/01/07','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/01/20','yyyy/mm/dd'));
INSERT INTO vacations VALUES (15,to_date('2017/01/15','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/01/19','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/02/17','yyyy/mm/dd'));
INSERT INTO vacations VALUES (15,to_date('2017/01/21','yyyy/mm/dd'));
INSERT INTO vacations VALUES (15,to_date('2017/01/22','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/02/05','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/01/23','yyyy/mm/dd'));
INSERT INTO vacations VALUES (15,to_date('2017/02/25','yyyy/mm/dd'));
INSERT INTO vacations VALUES (15,to_date('2017/02/28','yyyy/mm/dd'));
INSERT INTO vacations VALUES (17,to_date('2017/02/26','yyyy/mm/dd'));
COMMIT;

 

وهى على سبيل المثال الاجازات الخاصة للموظفين ارقام (15و17).
 
 
يتم استخدام الاستعلام التالى لعرض الاجازات الواقعة فى ايام متتالية لكل موظف على حدة :
 
SELECT employee_id, vac_date FROM
(SELECT employee_id ,vac_date, LEAD(vac_date) OVER (ORDER BY employee_id, vac_date) next_vac, LAG(vac_date)OVER (ORDER BY employee_id,vac_date) prv_vac
FROM vacations)
WHERE vac_date - prv_vac  BETWEEN 0 AND 1
OR next_vac - vac_date BETWEEN 0 AND 1
ORDER BY  vac_date;
 
حيث تعمل الدالة LEAD على ايجاد التاريخ التالي (للتاريخ الموجود فى الـ row الحالى )  حسب الترتيب الوارد فى (ORDER BY) الخاص بها. 
اما الدالة LAG فتعمل على ايجار التاريخ السابق  (للتاريخ الموجود فى الـ row الحالى )  حسب الترتيب الوارد  فى (ORDER BY) الخاص بها. 
 
ولانه لا يمكن استخدام هذه الدوال فى الـ WHERE فقد تم وضعها فى sub-query كما فى الكود الموضح عاليه.
 
 
مع وافر تحياتى
 
اسامه سليمان
 
 
تم تعديل بواسطة Osama Soliman
رابط هذا التعليق
شارك

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

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

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

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

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

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