آموزش تبدیل تاریخ میلادی به خورشیدی در mysql با تابع اختصاصی
تبدیل تاریخ میلادی به خورشیدی در mysql برای این کاربرد داره که اینترنت و وب جایگاه خودشو تو زندگی و کسب و کار باز کرده که وب پارسی هم از این قاعده مستثنی نیست یکی از عوامل مهم در وب پارسی استفاده از تاریخ خورشیدی میباشد. روشهای مختلفی برای تبدیل تاریخ خورشیدی وجود دارد استفاده از اسکریپتهای تبدیل تاریخ مثل جلالی یا پارسی دیت یا نوشتن یک تابع در سطح بانک داده و استفاده از آن.
اهمیت تبدیل تاریخ شمسی در وب فارسی
هر سایت یا اپلیکیشنی که برای مخاطب فارسی زبان ساخته می شه، دیر یا زود با این چالش روبه رو می شه: چطور تاریخ میلادی که در دیتابیس ذخیره شده رو به تاریخ جلالی (شمسی) قابل فهم برای کاربر تبدیل کنیم؟
روش های تبدیل تاریخ شمسی در mysql
برای تبدیل تاریخ خورشیدی معمولاً از یکی از این روش ها استفاده می شه:
- استفاده از اسکریپت های آماده تبدیل تاریخ مثل کتابخانه جلالی (Jalali) یا PersianDate
- نوشتن یک تابع اختصاصی در سطح بانک اطلاعاتی (Database) و فراخوانی مستقیم آن در کوئری ها
در این مقاله، روش دوم رو با یک مثال عملی برای MySQL بررسی می کنیم.
تابع MySQL برای تبدیل تاریخ میلادی به شمسی
کد زیر یک تابع برای تبدیل تاریخ در mysql + فورمت بندی آن می باشد:
CREATE DEFINER=`root`@`localhost` FUNCTION `persian_date`(g_date date,outs varchar(10)) RETURNS varchar(20) CHARSET latin1 BEGIN declare g_year int; declare p_month varchar(2); declare g_day int; declare leap int; declare pdate varchar(10); set g_year=YEAR(g_date); set g_day=DAYOFYEAR(g_date); if g_day>79 then set g_day=g_day-79; set g_year=g_year-621; else set leap=(g_year-1)%4; set g_year=g_year-622; if leap=0 then set g_day=g_day+287; else set g_day=g_day+286; end if; END IF; if leap=0 and g_day=366 then set p_month=12; set g_day=30; else case when g_day>0 and g_day<32 then set p_month='01'; when g_day>31 and g_day<63 then set p_month='02'; set g_day=g_day-31; when g_day>62 and g_day<94 then set p_month='03'; set g_day=g_day-62; when g_day>93 and g_day<125 then set p_month='04'; set g_day=g_day-93; when g_day>124 and g_day<156 then set p_month='05'; set g_day=g_day-124; when g_day>155 and g_day<187 then set p_month='06'; set g_day=g_day-155; when g_day>186 and g_day<217 then set p_month='07'; set g_day=g_day-186; when g_day>216 and g_day<247 then set p_month='08'; set g_day=g_day-216; when g_day>246 and g_day<277 then set p_month='09'; set g_day=g_day-246; when g_day>276 and g_day<307 then set p_month='10'; set g_day=g_day-276; when g_day>306 and g_day<337 then set p_month='11'; set g_day=g_day-306; when g_day>336 then set p_month='12'; set g_day=g_day-336; end case; end if; set outs=REPLACE(outs,'y',g_year); set outs=REPLACE(outs,'m',p_month); set outs=REPLACE(outs,'d',g_day); RETURN outs; END$$
نحوه استفاده از تابع persian_date
برای فراخوانی تابع تبدیل تاریخ و دریافت خروجی شمسی، کافیه در کوئری خودتون از دستور زیر استفاده کنید:
select persian_date(my_date,'y-m-d')as date from my_table
در اینجا
my_date :اسم ستونی از نوع Date که میخواهید انرا به تاریخ خورشیدی تبدیل کنید.
my_table:نام جدول مورد نظر
نکات و محدودیت های تابع تبدیل تاریخ
قبل از استفاده در محیط عملیاتی (Production) به این نکات دقت کنید:
- محاسبه سال کبیسه ناقص است. منطق فعلی تابع، کبیسه شمسی رو با یک چرخهی ساده ۴ ساله تخمین می زنه، در حالی که تقویم جلالی از قاعده دقیق تری (چرخهی ۳۳ ساله) پیروی می کنه. برای پروژه های حساس (مثل سامانه های مالی یا قراردادی)، پیشنهاد می شه از کتابخانه های استاندارد و به روز تبدیل تاریخ (در سطح PHP یا JavaScript) استفاده کنید، نه صرفاً این تابع.
- صفر ابتدایی روزها و ماه ها در خروجی نمایش داده نمی شه (مثلاً روز پنجم بهصورت
5نه05نمایش داده می شه)، که برای فرمت های استاندارد تاریخ باید باLPAD()اصلاح بشه. - نام تابع (
persian_date) و پارامترها (g_date,outs) بهتره در پروژه های بزرگ تر با یک قرارداد نام گذاری واضح تر جایگزین بشه تا خوانایی کد در تیم بالا بره. - اجرای منطق تبدیل تاریخ در سطح دیتابیس کارایی خوبی برای کوئری های ساده داره، اما برای پروژه های بزرگ، جدا کردن این منطق به لایه برنامه (Application Layer) با یک کتابخانه تست شده، نگه داری کد رو در بلندمدت راحت تر می کنه.
دلفی، php,wordpress,python,jquery و دیگر هیچ
موسس مجموعه مبین قاسم پور ۱۳۶۳-۱۴۰۵ معروف به LordViper عزیزی که دیگر در جمع ما نیست ولی نوشتههاش هنوز هست، یادش گرامی ولی دسترنج ایشون همچون پلاگین های پارسی دیت در اختیار همگان هستش
شاید امروز جواب خیلی از سؤالها را بتوان از AI گرفت، اما تولید مطالب تخصصی، تجربهمحور و عمیق هنوز به انگیزه نیاز دارد. این نظرات و بازخوردهای شماست که به ما نشان میدهد ادامه دادن این مسیر ارزشمند است.
دیدگاه شما چیست؟