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

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

صورة
- - - - -

convert julian date to date format in oracle 9i


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

#1 majhool

majhool

    عضو

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

تاريخ المشاركة 06 September 2005 - 12:31 AM

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

اريد طريقة لتحويل التاريخ من 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

#2 أسامة موسى

أسامة موسى

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 2,381 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 06 September 2005 - 10:32 AM

الاخ الكريم
عليك بتطبيق التالي
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

ارجو ان تكون الفكرة قد وصلت
۩ اللهـــــــــــــــــــــــم صلي على سيدنا محمد وعلـى آله وصحبه أجمـعين ۩
۩ سبحـــــــــــــــــان الله وبحمده ....... سبحــــــــــــــــــــــــان الله العظيم ۩



يمكنك زيارتي على صفحتي الخاصة بالفيس بوك على الرابط AskOsama

يمكنك زيارتي على مدونتي الجديدة على الرابط http://askossama.blogspot.com

#3 majhool

majhool

    عضو

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

تاريخ المشاركة 06 September 2005 - 12:45 PM

شكرا على الرد

سوف اقوم بتجربة select statemnet

#4 أسامة موسى

أسامة موسى

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 2,381 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 06 September 2005 - 12:50 PM

وياليت لما تحل الحل كامل تعرضه هنا بالمنتدى
ليستفيد منه الجميع <_<

تم التعديل بواسطة Admin05, 06 September 2005 - 01:04 PM.

۩ اللهـــــــــــــــــــــــم صلي على سيدنا محمد وعلـى آله وصحبه أجمـعين ۩
۩ سبحـــــــــــــــــان الله وبحمده ....... سبحــــــــــــــــــــــــان الله العظيم ۩



يمكنك زيارتي على صفحتي الخاصة بالفيس بوك على الرابط AskOsama

يمكنك زيارتي على مدونتي الجديدة على الرابط http://askossama.blogspot.com

#5 chayah

chayah

    مشترك

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

تاريخ المشاركة 06 September 2005 - 02:10 PM

أعتقد ان الكود التالي يقوم بالعمل وبطريقة اسهل:

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;

تم التعديل بواسطة chayah, 06 September 2005 - 02:13 PM.


#6 أسامة موسى

أسامة موسى

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 2,381 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 06 September 2005 - 02:56 PM

الاخ chayah
ماذا بالنسبة للشهر وكذلك كيف يتم حساب اليوم في السنة لو كان الرقم
105095 مثلا حيث
095 عدد ايام السنة يعني في اي شهر يقع
05 السنة
1 القرن

فيجب ان تعرف ان 095 يمثل الشهر واليوم وكذلك
وهو عبارة عن شهر مارس يوم 3

فهل معادلتك تطبق ذلك؟؟!!
۩ اللهـــــــــــــــــــــــم صلي على سيدنا محمد وعلـى آله وصحبه أجمـعين ۩
۩ سبحـــــــــــــــــان الله وبحمده ....... سبحــــــــــــــــــــــــان الله العظيم ۩



يمكنك زيارتي على صفحتي الخاصة بالفيس بوك على الرابط AskOsama

يمكنك زيارتي على مدونتي الجديدة على الرابط http://askossama.blogspot.com

#7 chayah

chayah

    مشترك

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

تاريخ المشاركة 10 September 2005 - 12:23 PM

نعم أخي admin05 تطبق لأن sql يقوم بالمهمة نيابة عنك.
يمكنك أن تجرب ذلك مع العلم أن التاريخ 105095 الذي ذكرته يقع في الشهر الرابع وهو: 05/04/2005

#8 أسامة موسى

أسامة موسى

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 2,381 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 10 September 2005 - 12:27 PM

نعم أخي admin05 تطبق لأن sql يقوم بالمهمة نيابة عنك.
يمكنك أن تجرب ذلك مع العلم أن التاريخ 105095 الذي ذكرته يقع في الشهر الرابع وهو: 05/04/2005

عرض المشاركة


الاخ chayah
return to_date(new_day0, 'YYYYDDD');
افهم من هذه الجزء من الفانكشين انه يرجع الايام والسنوات فقط فأين الشهر ؟؟؟!!!
۩ اللهـــــــــــــــــــــــم صلي على سيدنا محمد وعلـى آله وصحبه أجمـعين ۩
۩ سبحـــــــــــــــــان الله وبحمده ....... سبحــــــــــــــــــــــــان الله العظيم ۩



يمكنك زيارتي على صفحتي الخاصة بالفيس بوك على الرابط AskOsama

يمكنك زيارتي على مدونتي الجديدة على الرابط http://askossama.blogspot.com

#9 majhool

majhool

    عضو

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

تاريخ المشاركة 15 September 2005 - 10:49 PM

نظراً لانشغالي في الفترة السابقة سأقوم بكتابة الـ Function خلال هذه الفترة وأعرضه في المنتدى

شكراً جزيلاً على المشاركات

#10 majhool

majhool

    عضو

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

تاريخ المشاركة 16 September 2005 - 01:50 PM

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

أولا:
من خلال ملاحظاتي في إدخال التواريخ عن طريق 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 9i

3- تم استخدامColumn Formula لتحويل التاريخ المخزن في قاعدة البيانات إلي الشكل DD/MM/YYYY

4- : The Function is
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------

#11 majhool

majhool

    عضو

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

تاريخ المشاركة 16 September 2005 - 01:55 PM

THE FUNCTION IS :
[SIZE=1]

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;


-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------

#12 majhool

majhool

    عضو

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

تاريخ المشاركة 16 September 2005 - 01:58 PM

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;

تم التعديل بواسطة majhool, 16 September 2005 - 02:14 PM.


#13 majhool

majhool

    عضو

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

تاريخ المشاركة 16 September 2005 - 02:20 PM

ملاحظة:
اذا توجد طريقة افضل لكتابة الفانكشين بحيث تتحقق كل الاحتمالات يرجى الاضافة في المنتدى


اخـــيرا :
يرجى الدعاء من ظهر الغيب بأن تتحقق كل امنياتي في القريب العاجل.

#14 chayah

chayah

    مشترك

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

تاريخ المشاركة 17 September 2005 - 09:13 AM

نعم أخي admin05 تطبق لأن sql يقوم بالمهمة نيابة عنك.
يمكنك أن تجرب ذلك مع العلم أن التاريخ 105095 الذي ذكرته يقع في الشهر الرابع وهو: 05/04/2005

عرض المشاركة


الاخ chayah
return to_date(new_day0, 'YYYYDDD');
افهم من هذه الجزء من الفانكشين انه يرجع الايام والسنوات فقط فأين الشهر ؟؟؟!!!

عرض المشاركة


الأخ admin05 تحية وبعد:
لماذا لاتجرب ال function بنفسك وهو يقوم بالعمل المطلوب إن شاء الله
أما بالنسبة للفانكشن to_date فإنه استخدم ليعمل convert إلى نوع date وكما هو معلوم النوع date يتضمن السنة والشهر واليوم