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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

فائدة الفانكشنtrunc


3 رد (ردود) على هذا الموضوع

#1 hrs

hrs

    عضو نشط

  • الأعضــاء
  • 282 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 17 March 2009 - 10:33 AM

السلام على اهل السلام

ارجو المساعدة لمن يستطيع ..
لم افهم ماذا تفعل الفانكشن trunc

وهذه امثله عليها
trunc(to_date('22-AUG-03'), 'YEAR') would return '01-JAN-03'

trunc(to_date('22-AUG-03'), 'Q') would return '01-JUL-03'

trunc(to_date('22-AUG-03'), 'MONTH') would return '01-AUG-03'

trunc(to_date('22-AUG-03'), 'DDD') would return '22-AUG-03'

trunc(to_date('22-AUG-03'), 'DAY') would return '17-AUG-03'


اتمنى الرد بأسرع وقت ممكن :(

#2 TROYMAN

TROYMAN

    مشترك

  • الأعضــاء
  • 107 مشاركة

تاريخ المشاركة 17 March 2009 - 01:24 PM

السلام عليكم...

بداية يجب فهم الفرق بين Trunc و Round
Round تقرب و تقتطع (تصفر الباقي)
Trunc لا تقرب فقط تقتطع
1* select round(567.89,-2) from dual ROUND(567.89,-2)
----------------
600


بالنسبة للـ -2 يحدد الخانة التي أريد تقريبها حسب الخانة التي تسبقها .
وفي المثال سوف يقرب المئات حسب العشرات و يصفّر باقي الخانات و بما أن الأرقام العشرية الصفرية لا تؤثر على النتيجة تحذف .
بالنسبة للترقيم :
أول خانة على يسار الفاصلة (الآحاد) تحدد بـ 0
و العشرات -1 و المئات -2 و هكذا....
أما على يمين الفاصلة فتحدد بـ 1 و 2 و 3 و هكذا....
و تتم عملية التقريب في حال كانت الخانة التي أريد المقارنة معها أكبر أو تساوي 5
و في مثالنا : سوف يقارن مع الـ 6 و تتم عملية التقريب .
و منطقياً 567 هي أقرب إلى 600 من الـ 500
بينما 549 هي أقرب إلى 500

SQL> select trunc(567.89,-2) from dual; TRUNC(567.89,-2)
----------------
500


أما في Trunc يقوم دائماً بالإقتطاع (تصفير باقي الخانات)

هذا ما يتم مع الأرقام في كلتا الحالتين أما مع التواريخ فالحل مشابه تماماً .
SQL> select to_char(trunc(to_date('22-AUG-03'), 'YEAR'),'dd mm yyyy hh:mi:ss') from dual;

TO_CHAR(TRUNC(TO_DA
-------------------
01 01 2003 12:00:00

هنا سوف يقوم بالاقتطاع حسب السنة دون تقريب , لذلك سوف يقوم فقط بتصفير كافة الأجزاء التي تسبق السنة .
JAN هو أول شهر
01 هو أول يوم
12 هي أول ساعة في اليوم

SQL> select to_char(round(to_date('22-AUG-03'), 'YEAR'),'dd mm yyyy hh:mi:ss') from dual; TO_CHAR(ROUND(TO_DA
-------------------
01 01 2004 12:00:00

بينما في هذه الحالة قام بتقريب السنة حسب الشهر و هنا الشهر 7 وهو أكبر أو يساوي النصف(6) لذلك قام بالتقريب و تصفير باقي الأجزاء (الشهر - اليوم - الساعة)
سوف أشرح باقي الأمثلة بشكل موجز :

trunc(to_date('22-AUG-03'), 'Q') would return '01-JUL-03'
بما أن AUG هو في الربع الثالث سيتم الرجوع إلى أول شهر في هذا الربع وهو JUL
من الشهر 1 إلى 3 الربع الأول
من الشهر 4 إلى 6 الربع الثاني
من الشهر 7 إلى 9 الربع الثالث
من الشهر 10 إلى 12 الربع الرابع


trunc(to_date('22-AUG-03'), 'MONTH') would return '01-AUG-03'

سيتم الرجوع إلى أول يوم في الشهر


trunc(to_date('22-AUG-03'), 'DDD') would return '22-AUG-03'

لا معنى لها , لأن DDD هو رقم اليوم من السنة


trunc(to_date('22-AUG-03'), 'DAY') would return '17-AUG-03'

سيتم الرجوع إلى أول يوم في الأسبوع


آسف عل إطالة ...
بس هيك سؤال بدو شرح طويل...أنا جاهز للإعادة


<<اللهم لا علـم لنا إلا ما علّمتنا إنك أنت العليــم الحكيــم>>
<<اللهم علّمنا ما ينفعنا و انفعنا بما علّمتنا و ازدنا علماً>>



Programmer (C#.Net,C++,ASP) & Oracle Developer


#3 hrs

hrs

    عضو نشط

  • الأعضــاء
  • 282 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 17 March 2009 - 01:50 PM

ماشاء الله عليك .. فهمتها .. تسلم وفي ميزان حسناتك ان شاء الله

شكرا على الشرح المفصل :(

#4 almost.honey

almost.honey

    عضو

  • الأعضــاء
  • 13 مشاركة

تاريخ المشاركة 19 April 2009 - 12:41 PM

يسلموا على الرد ..الصراحه الشرح أفادني ;)