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

convert julian date to date format in oracle 9i


majhool

Recommended Posts

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

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

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

الاخ الكريم
عليك بتطبيق التالي

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


ارجو ان تكون الفكرة قد وصلت

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

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

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

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

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
رابط هذا التعليق
شارك

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

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

فهل معادلتك تطبق ذلك؟؟!!

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

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

46792[/snapback]




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

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

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

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

THE FUNCTION IS :


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;


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

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

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
رابط هذا التعليق
شارك

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


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

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

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

46792[/snapback]




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

46794[/snapback]




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

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

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

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

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

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

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

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