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

كيف يمكن تحديد عدد الأيام بين تاريخين بشرط معين


az123

Recommended Posts

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

كيف يمكن تحديد عدد الأيام بين تاريخين بشرط معين؟

مثلاً يوجد جدول به هذه البيانات

التاريخ الكمية
25/01/12 20
10/02/12 8
15/04/12 0
23/07/12 15
03/08/12 0
02/10/12 11

المطلوب: كيف يمكن حساب عدد الأيام التي تكون الكمية فيها لا تساوي صفر بين اول تاريخ وآخر تاريخ ؟

ياريت يكون في رد سريع من اي حد عنده فكرة

وشكراً

رابط هذا التعليق
شارك


select count(start_date) , count(end_date)

from table
where qty !=0;


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

أخي الفاضل شكراً لردك ومحاولة المساعدة
ولكن هذا الحل غير المطلوب
count تحسب عدد التواريخ فقط

المطلوب هو حساب عدد الأيام بين أول تاريخ وآخر تاريخ مع استبعاد (او طرح) الأيام التي تكون فيها الكمية = 0 ((من المثال الموجود في المشاركة الأولى))


ياريت يكون في رد سريع من اي حد عنده فكرة

وشكراً تم تعديل بواسطة az123
رابط هذا التعليق
شارك

السلام عليكم
اتفضل الحل
select id,max(date)-min(date) from table_name where qty<>0 and date BETWEEN 'firstdate' AND '2nddate' group by id
حيث id هو رقم الصنف
dateالتاريخ
firstdate بداية الفترة
2nddate نهاية الفترة
جرب وادعيلى
معكم ولكم نتواصل

رابط هذا التعليق
شارك


السلام عليكم
اتفضل الحل
select id,max(date)-min(date) from table_name where qty<>0 and date BETWEEN 'firstdate' AND '2nddate' group by id
حيث id هو رقم الصنف
dateالتاريخ
firstdate بداية الفترة
2nddate نهاية الفترة
جرب وادعيلى
معكم ولكم نتواصل


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

أخي الفاضل شكراً لردك ومحاولة المساعدة
ولكن هذا الحل لا يعطي المطلوب

المطلوب هو حساب عدد الأيام بين أول تاريخ وآخر تاريخ مع استبعاد (او طرح) الأيام التي تكون فيها الكمية = 0 ((من المثال الموجود في المشاركة الأولى))
رابط هذا التعليق
شارك

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


Create   table  aaa (
Id	integer ,
dat   date ,
qty  integer  ,			  
constraint  aaa_id_pk   primary  key (id)  ) ;

insert into aaa values ( 1 , '25/01/12' , 20 ) ;
insert into aaa values ( 2 , '10/02/12' , 8 ) ;
insert into aaa values ( 3 , '15/04/12' , 0 ) ;
insert into aaa values ( 4 , '23/07/12' , 15 ) ;
insert into aaa values ( 5 , '03/08/12' , 0 ) ;
insert into aaa values ( 6 , '02/10/12' , 11 ) ;
commit ;

Select  max(dat) , min(dat) , max( ( select count(dat) from aaa where qty = 0 ) ) zero , (max(dat) - min(dat)) - max( ( select count(dat) from aaa where qty = 0 ) ) net
From  aaa ;

MAX(DAT)			   MIN(DAT)			  ZERO			 NET
--------			  --------			----------   ----------
02/10/12			  25/01/12				 2			  249

Select  max(dat) , min(dat) , max( ( select count(dat) from aaa where qty = 0 and  dat > &mindat  and  dat < &maxdat ) ) zero , (max(dat) - min(dat)) - max( ( select count(dat) from aaa where qty = 0 ) ) net
From  aaa
Where  dat > &mindat  and  dat < &maxdat  ;



جزاك الله كل خير

رابط هذا التعليق
شارك

قم بتجربه الداله بها ماطلبت

CREATE FUNCTION ESLAM4444 (P_START_DATE DATE, P_END_DATE DATE )
 RETURN   NUMBER IS

 V_COUNT  NUMBER:=0;
 BEGIN
   SELECT TO_DATE(P_START_DATE,'DD-MM-YYYY')
	 - TO_DATE(P_END_DATE,'DD-MM-YYYY')
	   INTO V_COUNT
	   FROM DUAL
	   WHERE QTY!=0
	   AND P_START_DATE !=P_END_DATE
	   AND P_END_DATE!=P_START_DATE;
	   RETURN V_COUNT;
 END;

رابط هذا التعليق
شارك

المطلوب هو حساب عدد الأيام بين أول تاريخ وآخر تاريخ مع استبعاد (او طرح) الأيام التي تكون فيها الكمية = 0 ((من المثال الموجود في المشاركة الأولى))

يعني انت عايز تجمع كل الايام اللي فيها بضاعه وبعد كدا تطرحه من الايام اللي مفيهاش بضاعه
رابط هذا التعليق
شارك


المطلوب هو حساب عدد الأيام بين أول تاريخ وآخر تاريخ مع استبعاد (او طرح) الأيام التي تكون فيها الكمية = 0 ((من المثال الموجود في المشاركة الأولى))

يعني انت عايز تجمع كل الايام اللي فيها بضاعه وبعد كدا تطرحه من الايام اللي مفيهاش بضاعه


نعم بالظبط كده تم تعديل بواسطة az123
رابط هذا التعليق
شارك



Select max(dat) , min(dat) , max( ( select count(dat) from aaa where qty = 0 ) ) zero , (max(dat) - min(dat)) - max( ( select count(dat) from aaa where qty = 0 ) ) net
From aaa ;

MAX(DAT) MIN(DAT) ZERO NET
-------- -------- ---------- ----------
02/10/12 25/01/12 2 249
[/code]

جزاك الله كل خير


جزاك الله خير الجزاء
الكمية لا تساوي 0 في اليومين المحددين (15/4 و 3/8) فقط ولكن تساوي صفر في الفترة من (15/4 إلى 23/7) وأيضاً من (3/8 إلى 2/10)
يعني الكمية تساوي صفر في الفترة بين ( التاريخ التي فيه الكمية تساوي صفر و التاريخ التالي له)
أنتظر ردك وشكراً


select SUM(END_DATE-START_DATE) NO_DAYS,QTY from table_name
where qty<>0
and START_DATE >=P_START_DATE
AND END_DATE <=P_END_DATE
GROUP BY QTY






قم بتجربه الداله بها ماطلبت
CREATE FUNCTION ESLAM4444 (P_START_DATE DATE, P_END_DATE DATE )
RETURN NUMBER IS

V_COUNT NUMBER:=0;
BEGIN
SELECT TO_DATE(P_START_DATE,'DD-MM-YYYY')
	 - TO_DATE(P_END_DATE,'DD-MM-YYYY')
	 INTO V_COUNT
	 FROM DUAL
	 WHERE QTY!=0
	 AND P_START_DATE !=P_END_DATE
	 AND P_END_DATE!=P_START_DATE;
	 RETURN V_COUNT;
END;





شكراً لكل من الأخ الفاضل / احمد والأخ الفاضل / إسلام على طرح الحلول ولكن هذه الحلول لا تعطي النتيجة المطلوبة
المطلوب جملة ترجع النتائج التالية :
عدد الأيام الكلية في الفترة بين أول تاريخ وآخر تاريخ من المثال في المشاركة الأولى
251
عدد الأيام التي تكون فيها الكمية = 0
159
عدد الأيام التي لا تكون فيها الكمية = 0 (عدد الأيام الكلية - عدد الأيام التي تكون فيها الكمية = 0)
251 - 159 = 92
يا ريت تساعدوني في الوصول إلى الجملة الصحيحة التي ترجع النتائج السابقة وشكراً تم تعديل بواسطة az123
رابط هذا التعليق
شارك

طيب جرب كدا الحل دا وقولي

SELECT (MAX (F_date) - MIN (F_date)) "quantity greate than 0"
   , (MAX (e.S_date) - MIN (e.S_date)) "quantity equal  0"
   , (MAX (F_date) - MIN (F_date)) - (MAX (e.S_date) - MIN (e.S_date)) "subtraction"
 FROM (SELECT date_q F_date
	  FROM test
	 WHERE qty <> 0), (SELECT date_q S_date
						 FROM test
					    WHERE qty = 0) e;



test اسم الجدول
qty اسم عمود الكميه
date_q اسم عمود التواريخ

رابط هذا التعليق
شارك


طيب جرب كدا الحل دا وقولي
SELECT (MAX (F_date) - MIN (F_date)) "quantity greate than 0"
 , (MAX (e.S_date) - MIN (e.S_date)) "quantity equal 0"
 , (MAX (F_date) - MIN (F_date)) - (MAX (e.S_date) - MIN (e.S_date)) "subtraction"
FROM (SELECT date_q F_date
	 FROM test
	 WHERE qty <> 0), (SELECT date_q S_date
						 FROM test
					 WHERE qty = 0) e;



test اسم الجدول
qty اسم عمود الكميه
date_q اسم عمود التواريخ



شكراً جداً لردك
انا جربت هذا الحل ولكن يعطي نتيجة غير المطلوبة

quantity greater than 0 quantity equal 0 subtraction
----------------------- ----------------- -----------
			 251			 110		 141



المفروض تكون النتيجة :

quantity greater than 0 quantity equal 0
----------------------- ----------------
				 92			 159



أنتظر ردودكم
وشكراً لكم

تم تعديل بواسطة az123
رابط هذا التعليق
شارك

معنى كلامك انت عندك فقط عمود واحد بس بتسجل فى التاريخ ولا عمودين بتسجل فيه بدايه الفترة ونهايتها؟

رابط هذا التعليق
شارك


معنى كلامك انت عندك فقط عمود واحد بس بتسجل فى التاريخ ولا عمودين بتسجل فيه بدايه الفترة ونهايتها؟


عمود واحد فقط للتاريخ وعمود آخر فيه الكمية
رابط هذا التعليق
شارك

طيب جرب الكود دا

SELECT (MAX (F_date) - MIN (F_date)) "quantity greater than 0",
	 QTYZERO.COUNT "quantity equal 0",
	 (MAX (F_date) - MIN (F_date)) - QTYZERO.COUNT "SUB"
FROM (SELECT date_q F_date
	 FROM test
	 WHERE qty <> 0),
	 (SELECT SUM (
			 (SELECT MIN (date_q) DATE_Q
				 FROM test
				 WHERE qty <> 0
					 AND TO_DATE (date_q, 'dd-mm-rrrr') >
							 TO_DATE (E.DATE_Q, 'DD-MM-RRRR'))
			 - E.DATE_Q)
			 "COUNT"
	 FROM TEST E
	 WHERE QTY = 0) QTYZERO
GROUP BY QTYZERO.COUNT



quantity greater than 0 quantity equal 0	 SUB
---------------------- ---------------- ----------
			 251			 159		 92

تم تعديل بواسطة HELL-BOY
رابط هذا التعليق
شارك

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

أخي الكريم

الكود التالي مع افتراض وجود تسلسل لعمليات الإدخال
كما أن الكود التالي سوف يتجاهل التاريخ
من 1/1/2012 حتى تاريخ 25/1/2012
ومن 2/10/2012 حتى تاريخ 31/12/2012
لذلك يجب أن يكون رصيد أول المدة (1/1/2012) ورصيد أخر المدة (31/12/2012)

Select  max(aaa.dat) , min(aaa.dat) , (max(aaa.dat) - min(aaa.dat)) , (nvl(max(aa.zero),0)) , (max(aaa.dat) - min(aaa.dat) - (nvl(max(aa.zero),0)) ) netday
From aaa , ( select  sum(a.dat - aaa.dat ) zero
from aaa , (select id , dat  from aaa  where id in (select (id+1) id from aaa where qty = 0 )) a
where aaa.id = a.id-1
order by aaa.dat  ) aa ;

Select  max(aaa.dat) , min(aaa.dat) , (max(aaa.dat) - min(aaa.dat)) , (nvl(max(aa.zero),0)) , ( max(aaa.dat) - min(aaa.dat) - (nvl(max(aa.zero),0)) ) netday
From aaa , ( select  sum(a.dat - aaa.dat ) zero
from aaa , (select id , dat  from aaa  where id in (select (id+1) id from aaa where qty = 0 and  aaa.dat > &mindat  and  aaa.dat < &maxdat)) a
where  aaa.id = a.id-1
order by aaa.dat  ) aa 	
where  aaa.dat > &mindat  and  aaa.dat < &maxdat ;


جزاك الله كل خير

رابط هذا التعليق
شارك


طيب جرب الكود دا
SELECT (MAX (F_date) - MIN (F_date)) "quantity greater than 0",
	 QTYZERO.COUNT "quantity equal 0",
	 (MAX (F_date) - MIN (F_date)) - QTYZERO.COUNT "SUB"
FROM (SELECT date_q F_date
	 FROM test
	 WHERE qty <> 0),
	 (SELECT SUM (
			 (SELECT MIN (date_q) DATE_Q
				 FROM test
				 WHERE qty <> 0
					 AND TO_DATE (date_q, 'dd-mm-rrrr') >
							 TO_DATE (E.DATE_Q, 'DD-MM-RRRR'))
			 - E.DATE_Q)
			 "COUNT"
	 FROM TEST E
	 WHERE QTY = 0) QTYZERO
GROUP BY QTYZERO.COUNT



quantity greater than 0 quantity equal 0	 SUB
---------------------- ---------------- ----------
			 251			 159		 92




جزاك الله خيراً وزادك علماً
أنا جربت هذا الكود واشتغل معايا
SELECT ( MAX(F_DATE) - MIN(F_DATE) ) "ALL",
QTYZERO.COUNTT "QTY=0",
( MAX(F_DATE) - MIN(F_DATE) ) - QTYZERO.COUNTT "QTY>0"
FROM (SELECT TDATE F_DATE FROM TEST),
(SELECT SUM((SELECT MIN(TDATE) TDATE FROM TEST WHERE TQTY!=0 AND TDATE>E.TDATE)-E.TDATE) "COUNTT"
FROM TEST E WHERE TQTY=0) QTYZERO GROUP BY QTYZERO.COUNTT


والحمد لله أعطى النتائج الصحيحة :

ALL				    QTY=0				  QTY>0				 
---------------------- ---------------------- ----------------------
251				 159				 92				  



شكراً لك من شارك في هذا الموضوع بطرح الحول وكل القائمين على هذا الموقع
وأخص بالشكر الأخ الكريم HELL-BOY على طرح الحل المناسب

رابط هذا التعليق
شارك

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

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

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

×   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.

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

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

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