التحدى الرابع
select TRUNC((months_between(sysdate,hiredate))/12,0) as years,trunc((trunc(((months_between(sysdate,hiredate))/12)-(TRUNC((months_between(sysdate,hiredate))/12,0)),2))*12,0)
as months,trunc((((trunc(((months_between(sysdate,hiredate))/12)-(TRUNC((months_between(sysdate,hiredate))/12,0)),2))*12)-(trunc((trunc(((months_between(sysdate,hiredate))/12)-(TRUNC((months_between(sysdate,hiredate))/12,0)),2))*12,0)))*30,0)as days ,hiredate,sysdate from emp;
![Bigeyes](http://i.remal.com/img/smilies/new_icons/bigeyes.gif)
![Bigeyes](http://i.remal.com/img/smilies/new_icons/bigeyes.gif)
طبعاً واضح إنى عملت جملهكبييييييييييييره قوى بس ده اللى قدرت عليه لما حاولت لوحدى
لكن لما لاحظت إنكإستخدمت الداله mod بكل بساطه لم اصدق نفسى على كل الوقت الضائع
![](http://67.15.103.43/images/smilies/biggrin.gif)
الأعوام و الشهور عملتهامثلك بالظبط تقريباً ولكن فى الأيام أنظر الفارق
طريقتك فى الايام
TRUNC( MOD(months_between(sysdate,hiredate)*31,31),0) days
معكوكتى
![](http://67.15.103.43/images/smilies/biggrin.gif)
,trunc((((trunc(((months_between(sysdate,hiredate))/12)-(TRUNC((months_between(sysdate,hiredate))/12,0)),2))*12)-(trunc((trunc(((months_between(sysdate,hiredate))/12)-(TRUNC((months_between(sysdate,hiredate))/12,0)),2))*12,0)))*30,0)
لكنىلم أفهم لماذا ضربت فى 31 ثم سويت mod مع 31 مره أخرى أرجو الشرح
انت اشرح لي مالذي عملته !! ^^
لست بفائق ان اتتبع طريقتك الجميلة والذكية ^^
انصحك بنصيحتين ... فكر بسهولة ... وفكر بصعوبة ^^ ......
اذا كنت تعرف متى تستخدم الادوات .. فكر بسهولة ... انا فكرت بسهولة لاني املك اداة .... وهي
mod
واذا لم يكن لديك ادوات تعرفها .. فكر بصعوبة .... انت فكرت بصعوبة لانك تملك اداة لا تعرف أين تستخدمها وهي
mod
جميل حلك ^^ ولكن ..... خطأأأأأأأأأأأأأأ ^^
فقط الايام خطأ ^^
جرب ... مايلي ...
تاريخ اليوم مثلا 23/02/2006 ... الفرق بينه وبين التاريخ التالي : 22/02/2006
هو يوم .. والمفترض ان يكون الحل هو واحد ... انظر بعد التجارب .... :
SQL> select TRUNC( MOD(months_between(sysdate,'22/02/06')*31,31),0) days from dual ;
DAYS
----------
1
انظر طريقتك .... :
SQL> select trunc((((trunc(((months_between(sysdate,'22/02/06'))/12)-(TRUNC((months_between(sysdate,
'22/02/06'))/12,0)),2))*12)-(trunc((trunc(((months_between(sysdate,'22/02/06'))/12)-(TRUNC((months_b
etween(sysdate,'22/02/06'))/12,0)),2))*12,0)))*30,0)as days from dual ;
DAYS
----------
0
لا حول ولا قوة الا بالله ^^
طبعا .. انا لا اريد ان احاول بطريقتك .. ليست لانها خاطئة ... اعتقد والله اعلم بامكاني ان اوجدها .... بدون
mod
لكن بما اننا نملكها ... فلنشرح الجواب ...
اولا السنين ... كيف نوجد السنين ..
الشهر الواحد كم سنة ؟؟ لا تضحك يا هذا ... انظر الى الاجابة
الشهر الواحد = 1/12 سنة ..
الست اشهر = 6/12 سنة ... أي نصف سنة ...
قال لك مثلا ..... 11 شهر .... كم يساوي سنة ؟؟
11/12 .... ويطلع كسور .. طبعا لا نريد عرض الكسور في مثالنا .... اذن 0 سنة واحدى عشر شهرا ....
أي في النهاية ... هو طلب السنين ... = صفر سنة
لو 13 شهر ... أي واحد سنة .... (وشهر)
مالذي عملته ؟؟ قسمت على اثنى عشر .... واخذت العدد الصحيح ....
في دالة
trunc .... نأخذ العدد الصحيح اذا قلنا احد الامرين ...
Trunc(any , 0)
او
Trunc(any)
انظر السنين كيف حلها :
TRUNC((months_between(sysdate,hiredate))/12,0)
بعد ايجاد الفرق .. وليكن 13 شهر .... نقسم على اثنى عشر .. اذن .... سنة .... !!
طيب ... الباقي ماهو ؟؟؟ شهر صح ؟؟؟ اذن نأتي بالشهر كما يلي :
trunc(
(trunc(((months_between(sysdate,hiredate))/12)-(TRUNC((months_between(sysdate,hiredate))/12,0)),2))*12,0)
أي نحسب الفرق بين التاريخين وهو .. 13 شهر ..
اخذنا منها كم سنة ؟؟ سنة واحدة(12 شهر)
كم بقي ؟ شهر واحد ....
انظر الى ناتج البنفسج اذا كان الفرق في الشهور = 13
كم ناتجه ؟ نعم .... ناتجه هو ......
1.08333333
الان في الاخصر ... كم الناتج ؟؟ 13/12 =
1.08333333
لكن في الاخضر الغينا الكسور .... ويصير الناتج 1 ....
ياسلام .. الفرق بين البنفسج والاخضر هو .... 0
.08333333
وهو عدد السنين المتبقية .... أي
0.08 سنة (لاننا قسمنا سابقا على 12) ولقد قربنا لكسرين اثنين فقط وفقا للاصفر ...
من سنة الى شهر كيف نحول ؟؟؟ نضرب في 12 وكانت النتيجة هي : 0.99999996
ومع التقريب بدون كسور (للون الاسود) ..... فيصبح النتيجة النهائية = 1
الايام ....
TRUNC(
MOD(months_between(sysdate,hiredate)*31,31),0)
يكون في علمك ... لا ادري كيف عملت هذه ...
الافكار لا تبقى في الرأس صدقني .
.
سوف اتذكر ......
......
..... لماذا عملت حينها هذه الحركة ؟؟ ....؟؟؟؟؟
........
اها .... مثلا شهر ويوم ... أي بمعنى اخر ...
1.03225806 شهر
انظر الى الاخضر ... ضربنا الفرق ..... في 31 لتحويله الى ايام ..
اي مثلا شهر ويوم ... او 1.03225806 شهر ... اصبحو الان : 31.9999999 بمعنى اخر 32 يوم ..
الان ... باقي قسمة 32 على 31 هي واحد .....
الان لماذا عملنا هكذا ؟ لو الفرق سنة وشهر ويوم .....
أي 13.0322581 شهر .....
( 13.0322581
شهر = سنة وشهر ويوم ..... )
نقصنا 12 شهر للسنة الواحدة....
نقصنا 1 شهر .. للشهر الواحد... الان ذهب 13 شهر بالتمام .... صح؟
بقي 0.0322581 شهر .... لليوم الواحد
وقد استخدمنا دالة باقي القسمة ... حولنا 13.0322581 شهر الى 404.000001 يوم .... لماذا هذا التحويل ؟ لأننا نريد استخلاص الايام ....
الان ... نقسم 404 على 31 ... لكي ننتج عدد الشهور الفائتة ... وبعد القسمة نوجد الباقي ...
الباقي كان واحد ... يعني 403 يوم ... نقصناهم كسنة واحدة وشهر واحد .... أي 13 شهر ... وبقي من 404 كم ؟ واحد
الفكرة النهائية .. هي اننا نريد تنقيص عدد الشهور والسنين ... لكي نعرف كم الايام ..
اعرف ان شرحي طويل وغير مفهوم .. لكن اذا اردت ان احاول معك مرة ثانية بطريقة اخرى ... كلمني ...
بالمناسبهكان الدرس شيقاً جداً خصوصاً مع وجود تحديات رائعه تدعو للتفكير
وجزاك اللهخيراً
شكرا لك
بالمناسبه انا أعتبرت إن كل شهور السنه 30
يوم إفتراضياً
ما قسمتش شهورالسنه على 30 و 31 و 29 لأنى الصراحه مش حافظهم
![](http://67.15.103.43/images/smilies/tongue.gif)
عادي ... اهم شي انك فاهم ^^
== == == == == == == == == ==
الاخ هوروساكا
فى الدرس التاسع هناك شىء لم افهمه و هو إستخدام الدبل كوتيشن
"
حيثقمت أنت بحل أحد الأمثله هكذا
select to_char(hiredate,'DAY "OF" MONTH YYYY "IN" HH:MI:SS AM') from emp ;
فى حين قمت أنا بعملهاهكذا
select to_char(hiredate,'day'),('of'),to_char(hiredate,'month'),to_char(hiredate,'year'),('in'),to_char(hir edate,'hh:mi:ssam')from emp;
فكانت طويله شويه بدون إستخدام " فأنا أريدمعرفة متى نستخدم هذه العلامه
حبيبي ... كلا الطريقتين صحيحتين ...
فكرة علامة التنصيص الثنائية " ... هي ماذا ؟؟
عرض الجملة كما هي عليه .... صح ؟
نستخدمها متى ؟ داخل النص الذي بين علامة التنصيص الاحادية
'
وهي تعتبر اختصار .... بدلا ان نعمل مثلما عملت انت ... انت عملتها وكأنها عمود .... فالاسهل ان تجعلها بعلامة التنصيص الثنائية , بالرغم من انها بعض الاحيان تشربك العقل ...
...
على فكرة .. لا داعي ان تستخدم الاقواس في عرض النصوص ... انظر الى الحل مرة ثانية ..
SQL> select to_char(hiredate,'day'),'of',to_char(hiredate,'month'),to_char(hiredate,'year'),' in',
to_char(hiredate,'hh:mi:ssam')from emp;
تحديات الدرس التاسع
التحدى الأول
select to_char(sal,'$00,00,00,00.999')from bank;
نسيت السوال .. ولكن صحيح ^^
التحدى الثانى
select to_char(sysdate,'ddsp/mmsp "or" ddth/mmth "or" ddspth "from" mmspth "month" ') from dual ;
يوجد كلمة month ... الم يكن من المفترض ان تتحول الى شهر ؟؟؟
النتيجة كانت هكذا .....
three/one or 03rd/01st or third from first month
لماذا لم تتحول كلمة month الى الشهر في تاريخ sysdate أي لماذا لم تتحولالى January مثلا ؟؟؟
الإجابه لأنها كانت بين " " فكتبها كما هى
ياسلام .. رائع
التحدىالثالث
select round (to_date('16/12/2006','dd/mm/yy'),'month') from dual;
مالنتيجة المتوقعة ولماذا ؟؟
1/1/2007
لأن 16-12 أكبر من 15-12 فهىفى الشهر التالى و الذى يكون يناير العام القادم
صحيح .. وقل اننا نلعب في مجال الشهور !! كما رأينا في المدخل الثاني من الدالة ... صح ؟
التحدى الرابع
select ename,NVL(to_char(mgr),'NO MANAGER') from emp where ename ='KING';
صح ^^ !!
التحدىالخامس
فسر لي .. لماذا ظهرت النتيجة 7800 دولار ؟؟ مع العلم ان دالة SUM دالةذكية !!
واخبرني مالحل .. وما العمل ؟؟ ما الجملة البديلة ؟؟
لانها أخرجتنتيجة الموظفين الذين لهم رواتب إضافيه فقط حيث أن فى حالة عدم و جود راتب إضافىتكون قيمة (null)
والجمله البديله هى
select sum(sal + NVL(comm,0))from emp;
ممتاز ..... جميل ..... او كما اقترح اخوك .. براين وقال :
select sum(sal)+sum(comm) from emp ;