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

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

صورة
- - - - -

مشكلة بالمقارنة If To_char(sysdate,'day') In('friday','saturday')


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

#1 Naji_Ali

Naji_Ali

    مشترك

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

تاريخ المشاركة 24 December 2006 - 11:53 AM

السلام عليكم

أريد أن أكتب بروسيجر ليقوم بعمل ما طوال أيام الإسبوع باستثناء الجمعة والسبت
ولكن لا أدري لماذا يعمل طوال أيام الإسبوع، ويتجاهل المقارنة
وعند التجربة للمقارنة برقم التاريخ فإنه يعمل !!!!!!!!!!!

مع الشكر الجزيل للجميع

مثال
REATE OR REPLACE procedure Test
as
log_file_handle utl_file.file_type;
begin

if to_char(sysdate,'DAY') in('FRIDAY','SATURDAY') or 
   to_char(sysdate,'yyyymmdd') = '20070101' or
   to_char(sysdate,'yyyymmdd') = '20061224'
	then
   log_file_handle := UTL_FILE.FOPEN('C:\', 'Test1.txt','W');
   utl_file.put_line(log_file_handle,'--------------------------------------------');
   utl_file.put_line(log_file_handle,'Sorry, for TODAY Date: '||TO_CHAR(SYSDATE,'dd-mm-yyyy DAY'));
   utl_file.put_line(log_file_handle,'Thank You'); 
   utl_file.put_line(log_file_handle,'--------------------------------------------');
   utl_file.fclose(log_file_handle);

else

   log_file_handle := UTL_FILE.FOPEN('C:\', 'Test1.txt','W');
   utl_file.put_line(log_file_handle,'--------------------------------------------');
   utl_file.put_line(log_file_handle,'Good Work for Today = '||TO_CHAR(SYSDATE,'dd-mm-yyyy DAY'));
   utl_file.put_line(log_file_handle,'--------------------------------------------');
   utl_file.fclose(log_file_handle);
   
 end if;
 
end;
/

تم التعديل بواسطة Naji_Ali, 24 December 2006 - 11:55 AM.


#2 هانى سند

هانى سند

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

  • المجموعة الماسية
  • 743 مشاركة

تاريخ المشاركة 24 December 2006 - 12:36 PM

السلام عليكم
الأخ NAJI_ALI

استخدم في المقارنة FUNCATION REPLACE لازالة المسافات الموجودة في التاريخ و ايضا استخدم في FUNCTION TO_CHAR تحويل لغة التاريخ الي ENGLISH لانه من الممكن ان تكون لغة التاريخ عندك او الNLS_DATE_LANGUAGE
عربي و كالتالي
BEGIN 
IF  REPLACE(TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=''ENGLISH'''),' ','') ='SUNDAY' THEN  
DBMS_OUTPUT.PUT_LINE('WORK OK ');
END  IF;
END ;
و يمكنك أيضا استخدام رقم اليوم للمقارنة كالتالي
BEGIN 
IF  REPLACE(TO_CHAR(SYSDATE, 'D', 'NLS_DATE_LANGUAGE=''ENGLISH'''),' ','') ='2' THEN  
DBMS_OUTPUT.PUT_LINE('WORK OK ');
END  IF;
END ;
مع ملاحظة ان يام السبت و الجمعة هي ارقام 1 و 7 علي التوالي و لكن بالطبع تختلف هذه الارقام حسب بداية ايام الاسبوع ان كانت عربي ام انجليزي
فالعربي يبدا من يوم السبت و الانجليزي من يوم الاثنين لذلك فاستخدام اسم اليوم نفسه أفضل
و قد جربتها و اشتغلت معي
بالتوفيق

#3 Naji_Ali

Naji_Ali

    مشترك

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

تاريخ المشاركة 24 December 2006 - 05:01 PM

أخي الحبيب hanon_OCP،

شكرا جزيلا للرد، والله يعطيك ألف عافية
أنا فهمت من ردك أن أوراكل تكمل إسم اليوم بمسافات فارغة ولغاية 9 حروف، ولا أدري لماذا جعلوها كذلك !!!!!!!!!!!
وبالمناسبة 9 هو طول يوم الأربعاء بالإنجليزي

وقمت بالتجربة التالية:
SELECT TRIM (TO_CHAR (SYSDATE, 'DAY')),
	   LENGTH (TRIM (TO_CHAR (SYSDATE, 'DAY'))), TO_CHAR (SYSDATE, 'DAY'),
	   LENGTH (TO_CHAR (SYSDATE, 'DAY')), TRIM (TO_CHAR (SYSDATE + 2, 'DAY')),
	   LENGTH (TRIM (TO_CHAR (SYSDATE + 2, 'DAY'))),
	   TO_CHAR (SYSDATE + 2, 'DAY'), LENGTH (TO_CHAR (SYSDATE + 2, 'DAY'))
  FROM tab

وبالتالي جربت إستخدام TRIM والحمد لله وصلت للنتيجة المطلوبة
if TRIM (to_char(sysdate,'DAY')) in ('FRIDAY','SATURDAY') or 
   to_char(sysdate,'yyyymmdd') = '20070101'	 then

ومرة أخرى أنا شاكر لتفاعلك معي في هذه المشاركة

أخوك
ناجي غانم


Yesterday, 

All those backups seemed a waste of pay. 

Now my database has gone away. 

Oh I believe in yesterday. 



Suddenly, 

There's not half the files there used to be, 

And there's a milestone hanging over me 

The system crashed so suddenly. 

I pushed something wrong 

What it was I could not say. 

Now all my data's gone away

and I long for yesterday-ay-ay-ay. 



Yesterday, 

The need for back-ups seemed so far away. 

I knew my data was all here to stay, 

Now I believe in yesterday.


#4 هانى سند

هانى سند

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

  • المجموعة الماسية
  • 743 مشاركة

تاريخ المشاركة 25 December 2006 - 01:30 AM

السلام عليكم
هلا فيك أخي ناجي
الحمد لله ان مشكلتك قد حلت ;)
أعاقد ان مسالة المسافات ربما تعود بسبب تحويل التاريخ الي char باستخدام فانكشن to_char
فربما كان الreturn datatype من نوع char
و هو كما تعرف fixed length بمعني انه اذا قل عدد حروف الكلمة عن الطول المعرف له فيتمم تكملة الباقي بمسافات
عموما ريح دماغك دايما و عن عم ل اي مقارنات باستخدام char field أن تستعم ل الفانكشن replace او trim
بالتوفيق دأئما