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

كيف يتم طرح تاريخين فى الأوراكل


ktooof

Recommended Posts

السلام عليكم

أرجو المساعدة فى إيجاد إجراء يتم من خلاله طرح تاريخين وإ عطاء النتيجة فى شكل

سنه شهر يوم ORACLE9i


مثال: تاريخ التعيين 11-يناير -1950
تاريخ التقاعد 12-مارس-2008

النتيجة:
مدة الخدمة سنة شهر يوم
52 10 28

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

على قدر فهمى لسؤالك هذا الكود يحل المشكله و انا جربته مع تقرير خاص بالمعاشات



declare
sys_day NUMBER;
sys_month NUMBER;
sys_year NUMBER;
st_day NUMBER;
st_month NUMBER;
st_year NUMBER;
begin

SYS_DAY := TO_CHAR(sysdate, 'DD');
SYS_MONTH := TO_CHAR(:sysdate, 'MM');
SYS_YEAR := TO_CHAR(:Syadate, 'YYYY');


ST_DAY := TO_CHAR(:HIREDATE, 'DD');
ST_MONTH := TO_CHAR(:HIREDATE, 'MM');
ST_YEAR := TO_CHAR(:HIREDATE, 'YYYY');

IF TO_NUMBER(SYS_DAY) < TO_NUMBER(ST_DAY)
THEN
SYS_DAY := TO_NUMBER(SYS_DAY) + 30;
SYS_MONTH := TO_NUMBER(SYS_MONTH) - 1;
END IF;
IF TO_NUMBER(SYS_MONTH) < TO_NUMBER(ST_MONTH)
THEN
SYS_MONTH := TO_NUMBER(SYS_MONTH) + 12;
SYS_YEAR := TO_NUMBER(SYS_YEAR)- 1;
END IF;
:SERV_PER_DAY := TO_NUMBER(SYS_DAY) - TO_NUMBER(ST_DAY);
:SERV_PER_MONTH := TO_NUMBER(SYS_MONTH) - TO_NUMBER(ST_MONTH);
:SERV_PER_YAER := TO_NUMBER(SYS_YEAR) - TO_NUMBER(ST_YEAR);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
end;



بالتوفيق و الله المستعان،،

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

جزاك الله خير يا اخ سامح
لكن المشكلة في الشفرة التالية :

IF TO_NUMBER(SYS_DAY) < TO_NUMBER(ST_DAY) 
THEN
SYS_DAY := TO_NUMBER(SYS_DAY) + 30;
SYS_MONTH := TO_NUMBER(SYS_MONTH) - 1;
END IF;




انت افترضت ان الشهر الذي بدا الموظف العمل فيه 30 يوما ولكن قد تكون عدد ايام الشهر اقل او اكثر

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

الأخ سالم الفروي
اذا كان لديك حل فتفضل به و يبقى جزاك الله خير .. انا عن نفسى لم اواجه هذه المشكله على الأطلاق مع اى عميل .... بالتوفيق للجميع :rolleyes: :D

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

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

هذه اول مشاركة لى فى هذا المنتدى حيث اننى مشترك حديثا
واتمنى ان استمر فيه حيث اننى بالفعل استفيد منه واتمنى ان استمر معكم

واقدم شكر خاص للباشمهندس سامح على مواضيعه المتميزة ومشاركاتة

واعتقد بالنسبة لهذه المشاركة ان هذه الداله قد تفيد وهى
last_day()
,وهى تاخد متغير من نوع تاريخ date
وتعود باخر يوم فى هذا الشهر الموجود بالتاريخ


فكما فى مثال الباشمهندس سامح يمكن ان نقوم بوضع هذه الدالة بدلا من رقم 30 فقط

IF TO_NUMBER(SYS_DAY) < TO_NUMBER(ST_DAY)
THEN
SYS_DAY := TO_NUMBER(SYS_DAY) + to_number(to_char(last_day(:HIREDATE) ,'dd') ) ;
SYS_MONTH := TO_NUMBER(SYS_MONTH) - 1;
END IF;

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

الأخ سامح :

عند تنفيذ ال DECLARE يتم عرض رساله
Bind variable "SERV_PER_MONTH" not declared.
التكرم بمعرفة سبب ال ERORR
لانى إجتهدت كثيرا ولم أعرف السبب

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

السلام عليكم ورحمة الله وبركاته جرب التالي والنتيجة أدناه

select
trunc((to_date('12/03/2008','dd/mm/yyyy')-to_date('11/01/1950','dd/mm/yyyy'))/365) years,
trunc(mod(to_date('12/03/2008','dd/mm/yyyy')-to_date('11/01/1950','dd/mm/yyyy'),365)/30) months
trunc(mod(mod(to_date('12/03/2008','dd/mm/yyyy')-to_date('11/01/1950','dd/mm/yyyy'),365),30))
days
from dual
/

85 سنة
وشهرين
و15 يوم
YEARS     MONTHS       DAYS
------ ---------- ----------
   58          2         15

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

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

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

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

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

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

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

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