majhool بتاريخ: 5 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 5 سبتمبر 2005 السلام عليكم ورحمة الله وبركاتهاريد طريقة لتحويل التاريخ من julian date الى date format (dd/mm/yyyy)حيث انني استخدم برنامج JDedwards مع Oracle 9i Databaseحيث يتم تخزين التواريخ من نوع number data type بالشكل التالي :105001شرح طريقة التخزين( من اليمين الى اليسار ):001 : يمثل الايام في السنة ( الاول من يناير )05 : السنة ( سنة 2005)1 : القرن 21اي معنى التاريخ:105001 يمثل 1/1/2005ارجو منكم المساعدة في تحويل التاريخ الى شكل DD/MM/YYYYحيث انه مخزن في قاعدة البيانات من نوع Numberوكدلك اريد عرضه في report 9i على شكل dd/mm/yyyy اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
أسامة موسى بتاريخ: 6 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 6 سبتمبر 2005 الاخ الكريمعليك بتطبيق التالي select case when هنا يتم حساب السنة substr(to_char(your_records),2,2)||'-'|| هنا يتم حساب الاشهر وعليك بالتكملة لباقي الاشهر case when(to_number(substr(to_char(your_records),2,3))>=1 and (to_number(substr(to_char(your_records),2,3))<=31 then '01' when(to_number(substr(to_char(your_records),2,3))>=31and (to_number(substr(to_char(your_records),2,3))<=60 then '02' when(to_number(substr(to_char(your_records),2,3))>=61and (to_number(substr(to_char(your_records),2,3))<=92 then '03' when(to_number(substr(to_char(your_records),2,3))>=93and (to_number(substr(to_char(your_records),2,3))<=122 then '04' هنا يتم حساب الايام ||-||case when(to_number(substr(to_char(your_records),2,3))>=1and (to_number(substr(to_char(your_records),2,3))<=31 then --حساب ايام الشهر الاول (to_number(substr(to_char(your_records),2,3)) when(to_number(substr(to_char(your_records),2,3))>=32and (to_number(substr(to_char(your_records),2,3))<=60 then --حساب ايام الشهر الثاني (to_number(substr(to_char(your_records),2,3))-29 from your_table ارجو ان تكون الفكرة قد وصلت اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
majhool بتاريخ: 6 سبتمبر 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 6 سبتمبر 2005 شكرا على الردسوف اقوم بتجربة select statemnet اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
أسامة موسى بتاريخ: 6 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 6 سبتمبر 2005 (معدل) وياليت لما تحل الحل كامل تعرضه هنا بالمنتدىليستفيد منه الجميع تم تعديل 6 سبتمبر 2005 بواسطة Admin05 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
chayah بتاريخ: 6 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 6 سبتمبر 2005 (معدل) أعتقد ان الكود التالي يقوم بالعمل وبطريقة اسهل: create or replace function num_to_date(v0 varchar2) return date is new_day0 varchar2(7); begin new_day0 := 1900 + 100 * substr( v0, 1, 1) + substr( v0, 2, 2) || -- year substr(v0, 4, 3); -- day of the year return to_date(new_day0, 'YYYYDDD'); end; تم تعديل 6 سبتمبر 2005 بواسطة chayah اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
أسامة موسى بتاريخ: 6 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 6 سبتمبر 2005 الاخ chayahماذا بالنسبة للشهر وكذلك كيف يتم حساب اليوم في السنة لو كان الرقم105095 مثلا حيث 095 عدد ايام السنة يعني في اي شهر يقع05 السنة1 القرنفيجب ان تعرف ان 095 يمثل الشهر واليوم وكذلك وهو عبارة عن شهر مارس يوم 3فهل معادلتك تطبق ذلك؟؟!! اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
chayah بتاريخ: 10 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 10 سبتمبر 2005 نعم أخي admin05 تطبق لأن sql يقوم بالمهمة نيابة عنك.يمكنك أن تجرب ذلك مع العلم أن التاريخ 105095 الذي ذكرته يقع في الشهر الرابع وهو: 05/04/2005 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
أسامة موسى بتاريخ: 10 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 10 سبتمبر 2005 نعم أخي admin05 تطبق لأن sql يقوم بالمهمة نيابة عنك.يمكنك أن تجرب ذلك مع العلم أن التاريخ 105095 الذي ذكرته يقع في الشهر الرابع وهو: 05/04/200546792[/snapback] الاخ chayahreturn to_date(new_day0, 'YYYYDDD');افهم من هذه الجزء من الفانكشين انه يرجع الايام والسنوات فقط فأين الشهر ؟؟؟!!! اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
majhool بتاريخ: 15 سبتمبر 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 15 سبتمبر 2005 نظراً لانشغالي في الفترة السابقة سأقوم بكتابة الـ Function خلال هذه الفترة وأعرضه في المنتدىشكراً جزيلاً على المشاركات اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
majhool بتاريخ: 16 سبتمبر 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 سبتمبر 2005 السلام عليكم ورحمة الله وبركاته،،،،أولا:من خلال ملاحظاتي في إدخال التواريخ عن طريق Jdedwards Application حيث أنني جديدة في استخدامJdedwards Application مع Oracle DataBase أريد التوضيح أن Jdedwards يقومون بتخزين التواريخ قبل عام 1999 ( 5 أرقام ) مثال:99002 معناه 02/01/1999ولكن من عام 2000 يقومون بتخزين ( 6 أرقام ) بمعنى انهم يقومون بإضافة الرقم 1 من جهة اليسار ، اعتقد لحل مشكلة الألفية...مثال:100031 معناه 31/01/2000ثانيا:كانت لدي مشكلة في حساب الأيام حيث يجب الأخذ في الاعتبار سنوات كبيسة أو سنوات بسيطة حيث يختلف في حساب أيام شهر فبراير ( 28 أو 29 يوم)/*********************************************************************/الحــل :1- قمت بعمل جدولCreate table mytestdate(date1 number)2- تم تخزين التواريخ على شكل أرقام2- تم عمل تقرير باستخدام Oracle Developer Report 9i3- تم استخدامColumn Formula لتحويل التاريخ المخزن في قاعدة البيانات إلي الشكل DD/MM/YYYY4- : The Function is--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
majhool بتاريخ: 16 سبتمبر 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 سبتمبر 2005 THE FUNCTION IS :function CF_1Formula return Char islv_year varchar2(10);lv_day varchar2(10);lv_datemonth varchar2(30);BEGIN IF LENGTH(:date1)=6 THEN BEGIN --if length of Date=6 lv_year:='20'||substr(:date1,2,2); IF MOD(lv_year,4)=0 then lv_day:=to_number(substr(:date1,4,3)); ------- Case 1 : 29 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 060 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 061 and 091 THEN lv_day-60 ||'/03/' --March WHEN lv_day between 092 and 121 THEN lv_day-91 ||'/04/' --April WHEN lv_day between 122 and 152 THEN lv_day-121 ||'/05/' --May WHEN lv_day between 153 and 182 THEN lv_day-152 ||'/06/' --June WHEN lv_day between 183 and 213 THEN lv_day-182 ||'/07/' --July WHEN lv_day between 214 and 244 THEN lv_day-213 ||'/08/' --August WHEN lv_day between 245 and 274 THEN lv_day-244 ||'/09/' --September WHEN lv_day between 275 and 305 THEN lv_day-274 ||'/10/' --October WHEN lv_day between 306 and 335 THEN lv_day-305 ||'/11/' --November WHEN lv_day between 336 and 366 THEN lv_day-335 ||'/12/' --December ELSE NULL END; ------- Case 1 : 29 Feb ElSE lv_day:=to_number(substr(:date1,4,3)); ------- Case 2 : 28 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 059 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 060 and 090 THEN lv_day-59 ||'/03/' --March WHEN lv_day between 091 and 120 THEN lv_day-90 ||'/04/' --April WHEN lv_day between 121 and 151 THEN lv_day-120 ||'/05/' --May WHEN lv_day between 152 and 181 THEN lv_day-151 ||'/06/' --June WHEN lv_day between 182 and 212 THEN lv_day-181 ||'/07/' --July WHEN lv_day between 213 and 243 THEN lv_day-212 ||'/08/' --August WHEN lv_day between 244 and 273 THEN lv_day-243 ||'/09/' --September WHEN lv_day between 274 and 304 THEN lv_day-273 ||'/10/' --October WHEN lv_day between 305 and 334 THEN lv_day-304 ||'/11/' --November WHEN lv_day between 335 and 365 THEN lv_day-334 ||'/12/' --December ELSE NULL END; ------- Case 2 : 28 Feb End If; -- IF MOD lv_year END; --if length of Date=6 RETURN (lv_datemonth||lv_year); ---------------------------------------------------------------------ELSIF LENGTH(:date1)=5 then BEGIN --if length of Date=5 lv_year:='19'||substr(:date1,1,2); IF MOD(lv_year,4)=0 then lv_day:=to_number(substr(:date1,3,3)); ------- Case 1 : 29 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 060 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 061 and 091 THEN lv_day-60 ||'/03/' --March WHEN lv_day between 092 and 121 THEN lv_day-91 ||'/04/' --April WHEN lv_day between 122 and 152 THEN lv_day-121 ||'/05/' --May WHEN lv_day between 153 and 182 THEN lv_day-152 ||'/06/' --June WHEN lv_day between 183 and 213 THEN lv_day-182 ||'/07/' --July WHEN lv_day between 214 and 244 THEN lv_day-213 ||'/08/' --August WHEN lv_day between 245 and 274 THEN lv_day-244 ||'/09/' --September WHEN lv_day between 275 and 305 THEN lv_day-274 ||'/10/' --October WHEN lv_day between 306 and 335 THEN lv_day-305 ||'/11/' --November WHEN lv_day between 336 and 366 THEN lv_day-335 ||'/12/' --December ELSE NULL END; ------- Case 1 : 29 Feb ElSE lv_day:=to_number(substr(:date1,3,3)); ------- Case 2 : 28 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 059 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 060 and 090 THEN lv_day-59 ||'/03/' --March WHEN lv_day between 091 and 120 THEN lv_day-90 ||'/04/' --April WHEN lv_day between 121 and 151 THEN lv_day-120 ||'/05/' --May WHEN lv_day between 152 and 181 THEN lv_day-151 ||'/06/' --June WHEN lv_day between 182 and 212 THEN lv_day-181 ||'/07/' --July WHEN lv_day between 213 and 243 THEN lv_day-212 ||'/08/' --August WHEN lv_day between 244 and 273 THEN lv_day-243 ||'/09/' --September WHEN lv_day between 274 and 304 THEN lv_day-273 ||'/10/' --October WHEN lv_day between 305 and 334 THEN lv_day-304 ||'/11/' --November WHEN lv_day between 335 and 365 THEN lv_day-334 ||'/12/' --December ELSE NULL END; ------- Case 2 : 28 Feb End If; -- IF MOD lv_year END; --if length of Date=5 RETURN (lv_datemonth||lv_year); --------------------------------------------------------------------- ELSE RETURN (NULL); END IF; -- EXCEPTION WHEN NO_DATA_FOUND THEN RETURN (NULL); END;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
majhool بتاريخ: 16 سبتمبر 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 سبتمبر 2005 (معدل) function CF_1Formula return Char is lv_year varchar2(10); lv_day varchar2(10); lv_datemonth varchar2(30); BEGIN IF LENGTH(:date1)=6 THEN BEGIN --if length of Date=6 lv_year:='20'||substr(:date1,2,2); IF MOD(lv_year,4)=0 then lv_day:=to_number(substr(:date1,4,3)); ------- Case 1 : 29 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 060 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 061 and 091 THEN lv_day-60 ||'/03/' --March WHEN lv_day between 092 and 121 THEN lv_day-91 ||'/04/' --April WHEN lv_day between 122 and 152 THEN lv_day-121 ||'/05/' --May WHEN lv_day between 153 and 182 THEN lv_day-152 ||'/06/' --June WHEN lv_day between 183 and 213 THEN lv_day-182 ||'/07/' --July WHEN lv_day between 214 and 244 THEN lv_day-213 ||'/08/' --August WHEN lv_day between 245 and 274 THEN lv_day-244 ||'/09/' --September WHEN lv_day between 275 and 305 THEN lv_day-274 ||'/10/' --October WHEN lv_day between 306 and 335 THEN lv_day-305 ||'/11/' --November WHEN lv_day between 336 and 366 THEN lv_day-335 ||'/12/' --December ELSE NULL END; ------- Case 1 : 29 Feb ElSE lv_day:=to_number(substr(:date1,4,3)); ------- Case 2 : 28 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 059 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 060 and 090 THEN lv_day-59 ||'/03/' --March WHEN lv_day between 091 and 120 THEN lv_day-90 ||'/04/' --April WHEN lv_day between 121 and 151 THEN lv_day-120 ||'/05/' --May WHEN lv_day between 152 and 181 THEN lv_day-151 ||'/06/' --June WHEN lv_day between 182 and 212 THEN lv_day-181 ||'/07/' --July WHEN lv_day between 213 and 243 THEN lv_day-212 ||'/08/' --August WHEN lv_day between 244 and 273 THEN lv_day-243 ||'/09/' --September WHEN lv_day between 274 and 304 THEN lv_day-273 ||'/10/' --October WHEN lv_day between 305 and 334 THEN lv_day-304 ||'/11/' --November WHEN lv_day between 335 and 365 THEN lv_day-334 ||'/12/' --December ELSE NULL END; ------- Case 2 : 28 Feb End If; -- IF MOD lv_year END; --if length of Date=6 RETURN (lv_datemonth||lv_year); --------------------------------------------------------------------- ELSIF LENGTH(:date1)=5 then BEGIN --if length of Date=5 lv_year:='19'||substr(:date1,1,2); IF MOD(lv_year,4)=0 then lv_day:=to_number(substr(:date1,3,3)); ------- Case 1 : 29 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 060 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 061 and 091 THEN lv_day-60 ||'/03/' --March WHEN lv_day between 092 and 121 THEN lv_day-91 ||'/04/' --April WHEN lv_day between 122 and 152 THEN lv_day-121 ||'/05/' --May WHEN lv_day between 153 and 182 THEN lv_day-152 ||'/06/' --June WHEN lv_day between 183 and 213 THEN lv_day-182 ||'/07/' --July WHEN lv_day between 214 and 244 THEN lv_day-213 ||'/08/' --August WHEN lv_day between 245 and 274 THEN lv_day-244 ||'/09/' --September WHEN lv_day between 275 and 305 THEN lv_day-274 ||'/10/' --October WHEN lv_day between 306 and 335 THEN lv_day-305 ||'/11/' --November WHEN lv_day between 336 and 366 THEN lv_day-335 ||'/12/' --December ELSE NULL END; ------- Case 1 : 29 Feb ElSE lv_day:=to_number(substr(:date1,3,3)); ------- Case 2 : 28 Feb lv_datemonth:= CASE WHEN lv_day between 001 and 031 THEN lv_day-0 ||'/01/' --January WHEN lv_day between 032 and 059 THEN lv_day-31 ||'/02/' --February WHEN lv_day between 060 and 090 THEN lv_day-59 ||'/03/' --March WHEN lv_day between 091 and 120 THEN lv_day-90 ||'/04/' --April WHEN lv_day between 121 and 151 THEN lv_day-120 ||'/05/' --May WHEN lv_day between 152 and 181 THEN lv_day-151 ||'/06/' --June WHEN lv_day between 182 and 212 THEN lv_day-181 ||'/07/' --July WHEN lv_day between 213 and 243 THEN lv_day-212 ||'/08/' --August WHEN lv_day between 244 and 273 THEN lv_day-243 ||'/09/' --September WHEN lv_day between 274 and 304 THEN lv_day-273 ||'/10/' --October WHEN lv_day between 305 and 334 THEN lv_day-304 ||'/11/' --November WHEN lv_day between 335 and 365 THEN lv_day-334 ||'/12/' --December ELSE NULL END; ------- Case 2 : 28 Feb End If; -- IF MOD lv_year END; --if length of Date=5 RETURN (lv_datemonth||lv_year); --------------------------------------------------------------------- ELSE RETURN (NULL); END IF; -- EXCEPTION WHEN NO_DATA_FOUND THEN RETURN (NULL); END; تم تعديل 16 سبتمبر 2005 بواسطة majhool اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
majhool بتاريخ: 16 سبتمبر 2005 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 سبتمبر 2005 ملاحظة:اذا توجد طريقة افضل لكتابة الفانكشين بحيث تتحقق كل الاحتمالات يرجى الاضافة في المنتدىاخـــيرا :يرجى الدعاء من ظهر الغيب بأن تتحقق كل امنياتي في القريب العاجل. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
chayah بتاريخ: 17 سبتمبر 2005 تقديم بلاغ مشاركة بتاريخ: 17 سبتمبر 2005 نعم أخي admin05 تطبق لأن sql يقوم بالمهمة نيابة عنك.يمكنك أن تجرب ذلك مع العلم أن التاريخ 105095 الذي ذكرته يقع في الشهر الرابع وهو: 05/04/200546792[/snapback] الاخ chayahreturn to_date(new_day0, 'YYYYDDD');افهم من هذه الجزء من الفانكشين انه يرجع الايام والسنوات فقط فأين الشهر ؟؟؟!!!46794[/snapback] الأخ admin05 تحية وبعد:لماذا لاتجرب ال function بنفسك وهو يقوم بالعمل المطلوب إن شاء اللهأما بالنسبة للفانكشن to_date فإنه استخدم ليعمل convert إلى نوع date وكما هو معلوم النوع date يتضمن السنة والشهر واليوم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.