• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تبدیل تاریخ شمسی برای MYSQL
#1
یه هوراا واسه صاح بکشید که زحمتش پایه اونه (البته صالح جان یه مشکل خیلی خیلی کوچیک توی یه فاصله داشتی و مشکل توی یه فاصله که بعد از CONCAT_WS داده بودی. mysql به فاصله خیلی حساس هست و به خاطر همین تابع CONCAT_WS که بعدش فاصله باشه رو نمیشناسه)

توسط این کد شما می تونین از تابع g2j استفاده کنین.
کد به صورت زیر هست

کد پی‌اچ‌پی:
DROP FUNCTION IF EXISTS `g_days_in_month`;

DELIMITER ;;

CREATE DEFINER=`root`@`localhost` FUNCTION `g_days_in_month`(`msmallintRETURNS smallint(2)

BEGIN

    
CASE m

        WHEN 0 THEN 
RETURN 31;

        
WHEN 1 THEN RETURN 28;

        
WHEN 2 THEN RETURN 31;

        
WHEN 3 THEN RETURN 30;

        
WHEN 4 THEN RETURN 31;

        
WHEN 5 THEN RETURN 30;

        
WHEN 6 THEN RETURN 31;

        
WHEN 7 THEN RETURN 31;

        
WHEN 8 THEN RETURN 30;

        
WHEN 9 THEN RETURN 31;

        
WHEN 10 THEN RETURN 30;

        
WHEN 11 THEN RETURN 31;

    
END CASE;

   



END;;

DELIMITER ;



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

-- Function 
structure for `g2j`

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

DROP FUNCTION IF EXISTS `g2j`;

DELIMITER ;;

CREATE DEFINER=`root`@`localhost` FUNCTION `g2j`(`gdatedatetimeRETURNS char(10CHARSET utf8

BEGIN

    
DECLARE igygmgd,g_day_no,j_day_noj_np,jy,jm,jd INT DEFAULT 0;

    DECLARE 
resout char(10);

    
SET gy YEAR(gdate)-1600;

    
SET gm MONTH(gdate)-1;

    
SET gd DAY(gdate)-1;

    

    
SET g_day_no = ((365 *  gy) + mydivgy+3) - mydivgy+99 100 )+ mydiv gy+399400 ) );

       
SET i 0;

    WHILE (
gm) do

        
SET  g_day_no g_day_no g_days_in_month(i);

        
SET i i+1

    
end WHILE;



    if  
gm and (( gyand gy%100 <> )) or gy 400 0 THEN 

        SET     g_day_no 
=    g_day_no +1;

    
end IF;

       
set g_day_no g_day_no gd



    
SET j_day_no g_day_no -79;

    
SET j_np =  j_day_no DIV 12053;

    
set j_day_no j_day_no 12053;

    

    
SET jy 979+33*j_np+4*mydiv(j_day_no,1461);

    
set j_day_no j_day_no 1461;



    if 
j_day_no >= 366 then 

        SET jy 
jy mydiv(j_day_no-1365);

        
SET j_day_no =( j_day_no-1) % 365;

       
end if;



    
SET i 0;

    WHILE ( 
11 and j_day_no >= j_days_in_month(i) ) do

        
SET  j_day_no j_day_no -  j_days_in_month(i);

        
SET i i+1;

    
end WHILE;



       
SET jm i+1;

    
SET jd j_day_no+1;





     
SET resout=CONCAT_WS('-',jy,jm,jd);



    RETURN      
resout;



END;;

DELIMITER ;



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

-- Function 
structure for `j_days_in_month`

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

DROP FUNCTION IF EXISTS `j_days_in_month`;

DELIMITER ;;

CREATE DEFINER=`root`@`localhost` FUNCTION `j_days_in_month`(`msmallintRETURNS smallint(2)

BEGIN

    
CASE m

        WHEN 0 THEN 
RETURN 31;

        
WHEN 1 THEN RETURN 31;

        
WHEN 2 THEN RETURN 31;

        
WHEN 3 THEN RETURN 31;

        
WHEN 4 THEN RETURN 31;

        
WHEN 5 THEN RETURN 31;

        
WHEN 6 THEN RETURN 30;

        
WHEN 7 THEN RETURN 30;

        
WHEN 8 THEN RETURN 30;

        
WHEN 9 THEN RETURN 30;

        
WHEN 10 THEN RETURN 30;

        
WHEN 11 THEN RETURN 29;

    
END CASE;

   



END;;

DELIMITER ;



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

-- Function 
structure for `mydiv`

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

DROP FUNCTION IF EXISTS `mydiv`;

DELIMITER ;;

CREATE DEFINER=`root`@`localhost` FUNCTION `mydiv`(`aint,`bintRETURNS int(11)

BEGIN

 
return FLOORb);

END;;

DELIMITER 

روش استفاده هم به این صورت هست
اول باید وارد دیتابیس بشید و بعد این کدها رو اجرا کنید (توی هر دیتابیسی که کد بالا رو بزنین این تابع قابل دسترسی هست بعد مثلا داخل جدول iranphptable یه ستون date دارین به اسم iranphpdate حالا کدتون اینجوری میشه
کد پی‌اچ‌پی:
select g2j(iranphpdate) as persiandate from iranphptable 

دوستان اگر توابع دیگه ای هم می خوان اعلام کنن تا ببینیم میشه روش کار کرد
از صالح عزیز بسیار سپاسگذارم
  پاسخ
#2
خوب چطور می شه از این استفاده کرد اونوخ؟
همه جوره اش رو داریم ظاهرن
  پاسخ
تشکر شده توسط :
#3
هوراااااااااااااااااااااااااااااااا
واقعا دست صالح عزیز درد نکنه Smile
علم تاج افتخار دنیا و یادگار پس از مرگ است
  پاسخ
تشکر شده توسط :
#4
اول باید وارد دیتابیس بشید و بعد این کدها رو اجرا کنید (توی هر دیتابیسی که کد بالا رو بزنین این تابع قابل دسترسی هست بعد مثلا داخل جدول iranphptable یه ستون date دارین به اسم iranphpdate حالا کدتون اینجوری میشه
کد پی‌اچ‌پی:
select g2j(iranphpdate) as persiandate from iranphptable 

دوستان اگر توابع دیگه ای هم می خوان اعلام کنن تا ببینیم میشه روش کار کرد
  پاسخ
تشکر شده توسط :
#5
خواهش می کنم یا به عبارتی قابل یخ دو

این رو دیشب برای وحید فرستادم. و دیگر نتونستم ببینیمش. واسه همین تا الان کلی تغییر دادمش. و چند تابع دیگر مثل .pmonth,pyear,pmonthname و .... هم اضافه شده. فعلا دارم ازش دارم استفاده می کنم مشکلاتش در بیاد تا کامل بزارمش
  پاسخ
تشکر شده توسط : admin oia parvane amir.s molana
#6
این به این معنا بود که اگه من توی دیتا بیس یه سری تاریخ میلادی داشته باشم می تونم به صورت شمسی نشونش بدم؟ Idea
  پاسخ
تشکر شده توسط :
#7
بله دقیقا برای همین کار هست. منتها عیبی که داره این هست که باید از ورژن 5.1.x مای اسکیوال بهره بگیرید. و فعلا هم بهتره استفاده نشه تا کاملش رو منتشر کنم
  پاسخ
تشکر شده توسط : molana Alimokhlesi
#8
(۱۳۸۸ مهر ۰۵, ۰۲:۰۳ ق.ظ)zoghal نوشته: بله دقیقا برای همین کار هست. منتها عیبی که داره این هست که باید از ورژن 5.1.x مای اسکیوال بهره بگیرید. و فعلا هم بهتره استفاده نشه تا کاملش رو منتشر کنم

ایشالا کی؟
  پاسخ
تشکر شده توسط :
#9
راستش تموم کردمش . رو تست فعلا هم روی hamedan-samaschools.ir تست گذاشتم.
دو روز هست که درگیر تسویه حساب با محل کار سابقم هستم. تمومبشه سریع اوکی میکنم
شرمنده
  پاسخ
تشکر شده توسط : admin
#10
میدادی به بچه ها که تستش کنن و نظر بدن هم خوب میشد
واقعا دستت درد نکنه
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان