آموزش تبدیل تاریخ میلادی به خورشیدی در mysql با تابع اختصاصی

11 آذر 1392 اس کیو ال SQL

تبدیل تاریخ میلادی به خورشیدی در mysql برای این کاربرد داره که اینترنت و وب جایگاه خودشو تو زندگی و کسب و کار باز کرده که وب پارسی هم از این قاعده مستثنی نیست یکی از عوامل مهم در وب پارسی استفاده از تاریخ خورشیدی میباشد. روشهای مختلفی برای تبدیل تاریخ خورشیدی وجود دارد استفاده از اسکریپتهای تبدیل تاریخ مثل جلالی یا پارسی دیت یا نوشتن یک تابع در سطح بانک داده و استفاده از آن.

اهمیت تبدیل تاریخ شمسی در وب فارسی

هر سایت یا اپلیکیشنی که برای مخاطب فارسی‌ زبان ساخته می‌ شه، دیر یا زود با این چالش روبه‌ رو می‌ شه: چطور تاریخ میلادی که در دیتابیس ذخیره شده رو به تاریخ جلالی (شمسی) قابل‌ فهم برای کاربر تبدیل کنیم؟

روش‌ های تبدیل تاریخ شمسی در mysql

برای تبدیل تاریخ خورشیدی معمولاً از یکی از این روش‌ ها استفاده می‌ شه:

  1. استفاده از اسکریپت‌ های آماده‌ تبدیل تاریخ مثل کتابخانه‌ جلالی (Jalali) یا PersianDate
  2. نوشتن یک تابع اختصاصی در سطح بانک اطلاعاتی (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) با یک کتابخانه‌ تست‌ شده، نگه‌ داری کد رو در بلندمدت راحت‌ تر می‌ کنه.
💬

شاید امروز جواب خیلی از سؤال‌ها را بتوان از AI گرفت، اما تولید مطالب تخصصی، تجربه‌محور و عمیق هنوز به انگیزه نیاز دارد. این نظرات و بازخوردهای شماست که به ما نشان می‌دهد ادامه دادن این مسیر ارزشمند است.

دیدگاه شما چیست؟

نظرات (0)


ارسال نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

عضویت در شبکه‌های اجتماعی

جدیدترین مقالات و نکات برنامه‌نویسی را سریع تر از دیگران مطلع شوید.