توابع تاریخ شمسی جهت استفاده در Mysql
این پروژه رو تقدیم می کنم به سازمان مدیریت برنامه نویسان php
در تمامی پروژه ها یی که نیاز به تاریخ شمسی هست. برنامه نویسان با مشکلات خاصی ربرو هستند. در خیلی از تالار های گفتگو بارها و بارها خوندم که برای ذخیره تاریخ و محاسبات دقیق تر بر روی فیلد هایی که نوع انها تاریخ هست. بهتر هست تاریخ رو به صورت میلادی و به صورت timestamp نگهداری کنیم.خوب این روش بسیار کار آمد هست و بهینه . زیرا میتونیم با داشتن یک تاریخ میلادی ، تمامی تاریخ های دیگر همچون شمسی و قمری را استخراج کنیم. اما این روش معایب خودش رو همراه داره.این معایب رو با بیان یک مثال بررسی می کنم:
در Mysql توابع بسیار قدرتمند و مهمی برای کار با مقادیر نوع تاریخ و زمان وجود دارد. که برنامه نویس میتواند بدون درگیر شدن با کد نویسی و با استفاده از یک دستور در خط کوئری خود به نتیجه دلخواه خودش برسه. به عنوان مثال فرض کنید. میخواهیم یک آرشیو ماهیانه برای سیستم خبری ایجاد کنیم.
SELECT month(FROM_UNIX(regdate) as mo, SELECT year(FROM_UNIX(regdate) as yr, COUNT(*) as total FROM table GROUP BY mo,yr ORDER BY mo DESC yr DESC
برنامه نویس با مثال بالا به راحتی می تواند آرشیو ماهیانه مطالب سیستم خود را ایجاد کند. البته به میلادی.
اما برای آرشیو ماهیانه شمسی آیا جواب گو هست. جواب این هست. خیر!!!.
برای این خواسته برنامه نوبسان روش های متنوعه ای رو بسته به نیاز خود به اجرا میگزارند. عده ای یک فیلد با جدول خود اضافه می کنند و مقادیر تاریخ شمسی را درج می کنند.عده ای دیگر می یایند تاریخ شروع مطالب . تاریخ پایانی رو پیدا میکنند. و بعد از تجزیه و تحلیل کردن آرشیو ماهانه را استخراج می کنند.تمامی روش های موجود دارای پردازش کم و بیش بالایی هستند. تا به نتیجه دلخواه برسند.
من در این پروژه با استفاده از قابلیت تعریف پروسیجر و تابع که در نسخه ۵.x.x به بعد ارائه شد. یک سری تابع ، همانند توابع MySql شبیه سازی کردم با این تفاوت که این توابع نتیجه را به صورت شمسی بر میگردانند.
در این پروژه ۴ تا بع کاربردی date(),month(),year(), monthname() شبیه سازی شده.
برای استفاده از این توابع شما کافیست مراحل زیر را انجام بدید.
۱- دریافت فایل توابع : دریافت
۲- ایپورت کردن فایل در دیتابیس مورد نظر
بعد از انجام مراحل بالا برای تست توابع می تونید. از این کوئری برای تست استفاده کنید.
SELECT pnum(pdate(NOW())),pyear('2009-09-22'),pmonth('2009-09-22') , pmonthname( NOW());
مثال آرشیو ماهیانه
SELECT pmonth(FROM_UNIX(regdate) as mo, SELECT pyear(FROM_UNIX(regdate) as yr, COUNT(*) as total FROM table GROUP BY mo,yr ORDER BY mo DESC yr DESC
اگر نتیجه گرفتید. پس براحتی می توانید از این توابع کمال استفاده را ببرید.
نکته : در حال حاضر فقط می توان این توابع را از نسخه ۵.۱.به بالا استفاده کرد
جهت ادامه روند توسعه و رفع مشکلات این پروژه، من پروژه رو در github قرار دادم.
ممنون از شما پروژه رو در گیت هاب منتشر کردم. ممنون میشم به اسم خودتون این مورد رو فیکس کنید.
https://github.com/zoghal/Presian-Date-for-MySQL
تلاش علمی – عملی شما به همراه آزاد اندیشی فکری شما برای در اختیار قرار حاصل تلاش خود در اختیار دیگر عزیزان قابل تقدیره.
صمیمانه از شما تشکر می کنم و براتون آزروی موفقیت دارم
با احترام
مخلصی
ممنونم، خیلی بدرد بخوره! راستی چه عجب آپ کردی!!! خیلی وقت بود منتظر بودم!
مثل همیشه قابل تقدیر و فوقالعاده.
ممنون صالح جان
خیلی عالیه
دستتون درد نکنه
امیدوارم همیشه موفق باشید
عالیه صالح جان، مرسی واقعا
خیلی عالی است
برای نسخه ۵ اگر بود ، خیلی بهتر می شد :دی
خیلی عالی بود. مرسی. کمک بزرگی کردید.
ممنونم به خاطر زحمتی که کشیدید
سلام و خسته نباشید
مطلب جالبی بود … یک برنامه نویس حالیش نمیشه چه سوالی رو کجا بپرسه …
من میخواستم واسه نرم افزار(حسابداری) که خودم دارم مینویسم دیتابیس طراحی کنم برنامم رو تو visual Studio 2008 به زبان C# نوشتم آیا برای طراحی دیتابیس از Sql Server خود ویژال استفاده کنم به مشکل و محدودیتی بر نمیخورم مثل بک آپ گیری و … ؟ اگر این امکان وجود نداره از کدام ورژن Sql Server استفاده کنم؟
چه تفاوتی میکنه که دیتابیس رو تو خود ویژال یا جداگانه در SQl Serverطراحی کنیم؟
@اوژن استوار
ممنون دوست عزیز
در جواب سوال شما باید خدمتتون عرض کنم که بنده برنامه نویس وب هستم. با زبان پی اچ پی کار میکنم. و کلا با محصولات ماکروسافتی میانه خوبی ندارم.
اما میتونم یک پاسخ خدمتتون بدم. اون هم این هست. که این گونه ابزار های برای ایجاد پل ارتباطی بین شمای کد نویس و سرویس دهنده شما هست. و قالبا به صورت ویزاردی ایجاد میشوند تا به روند کار شما سرعت ببخشند.
من چند سالی هست که قیافه ویژاول استدیو رو ندیدم. اما تا اونجا که یادم هست. اونچه مورد نیاز شما هست رو جواب گو هست. اما اگر به دنبال کار حرفه با mssql هستید. بهتره از خود SQL Server Management Studio استفاده کنید.
بنظرم بهتره به جای استفاده از این توابع sql از توابع تبدیل تاریخ در خود php استفاده کنیم. چون در آرشیو ماهانه، مهم ماه ارسال مطلب هست،
در اینجا ممکن است نتیجه چندماه یکسان باشند که با array_unique() تکراری ها رو حذف می کنیم و پس از آن آرایه رو برای چند روز کش می کنیم و در هنگام درخواست از کش که بصورت آرایه سریال ذخیره شده استفاده می کنیم. مثل وردپرس که تقریبا هر ۲ روز کش می کنه
با سلام و خسته نباشید
از اینکه جواب دادید ممنونم … مشکلم رو با سرچ و پرس و جو حل کردم …
من تازه زبان پی اچ پی رو شروع کردم مطالب شما رو دنبال خواهم کرد
جالب بود ممنون
موفق و پیروز باشید
سلام و ممنون
فقط خواستم در مورد licence اش سوال کنم. آیا می تونیم در هر نوع پروژه ای ازش استفاده کنیم؟
در ضمن یک ابزار کاملا اوپن سورس رو هم می خوام معرفی کنم. حتما به درد دوستای PHPکار می خوره:
tinybutstrong
کاملا آزاد هست. مال خودتون هست :دی
سلام
با تشکر
فایلها در mysql ایمپورت نمیشه.
از چه نسخه از مای اسکیوال استفاده می کنید؟
@صالح
نسخه ۵.۱
@ترنم
خوب نباید مشکلی داشته باشید. آیا ارور خواصی دریافت می کنید؟
یا شاید انتظار دارید وقتی ایمپورت شد تو لیست تیبل ها بیاییند؟
برای تست اینکه ایمپورت شده اند یا خیر یک کوئری اجرا کنید و دستورات رو در این کوئری استفاده کیید
دست مریزاد.
سلام و خدا یارتون
مثل اینکه توی تابع pmonthname مشکلی هست. قسمت case تعداد ماهها (ماه یازدهم ۱۲ نوشته شده)
ممنون
سلام،
صالح دستت درد نکنه اینو ندیده بودم! خیلی خوشحال شدم وقتی دیدم اینو ایول…
مخلصیم. گویا یک اشتباهی توش هست اگر فهمیدی چیه به من بگو
سلام . ممنون از کار خوبتون.
فقظ ممکنه یک مثال از آرشیو هفتگی هم بزنید ؟
توابع پایه برای این کار نوشته شده. اما من توابع ای که با هفته کار میکنه رو تبدیل نکردم. خودتون میتونید با کمی پائین و بالا کردن این کار رو انجام بدید
ممنونم.
من هنوز تست هم نکردم.
اما گویا قسمت
CASE PMONTH(gdate)
که از ۱ تا ۱۲ هست … اما قسمت
CASE m
از ۰ تا ۱۱ هست.
که البته فکر میکنم باید از ۱ تا ۱۲ باشند به جای ۰ تا ۱۱.
لطفا کامنت قبلی بنده رو حذف کنید.
اشکال کاملا وارد هست.
این قسمت:
WHEN 12 THEN RETURN ‘بهمن’;
WHEN 12 THEN RETURN ‘اسفند’;
باید اصلاح بشه.
لطفا فایل را اصلاح بفرمایید.
سلام
واقعا لذت بردم.
اگه اشتباه نکنم فک کنم یه مشکل تایئی در خط ۲۲۷ وجود داره. و در اون خط باید به جای ۱۲ عدد ۱۱ رو نوشت.
لطفا بررسی اش کنید.
روز خوش
آقا صالح از اونجایی که خودتون تو کامنت ۱۶ گفتین که این اسکریپت توابع آزادن. من جسارت کردم و توابع تبدیل تاریخ شمسی به میلادی رو اضافه کردم و قدری اصلاحات دیگر روی اسکریپت اصلی انجام دادم و اون را در قالب مجوز gpl انتشار دادم.
اگه راضی به اینکار نیستین اعلام کنید.
دوستان عزیز هم اگه خواستن اسکریپت جدید رو داشته باشن به اینجا مراجعه کنن.
http://spitman.azdaa.com/fa/?p=33
اینم لینک دانلود
http://spitman.azdaa.com/wp-content/uploads/code/pdate-mysql.sql
ممنون از شما پروژه رو در گیت هاب منتشر کردم. ممنون میشم به اسم خودتون این مورد رو فیکس کنید.
https://github.com/zoghal/Presian-Date-for-MySQL
مهران عزیز من از اینکه مشکلات رو گزارش و در توسعه اون کمک کردید.
ضمن اینکه هیچ مشکلی در عمل شما نیست. بسیار سپاس گزارم.
فقط یک خواهش دارم. به دلیل اینکه روند تغییرات و توسعه این پروژه یکپارچه بشه من در گیت هاپ منتشرش کردم. ممنون میشم شما هم مواردی که در وبلاگتون ذکر کردید به همراه تعییرات در مخزن این پروژه منتشر کنید
با کمال افتخار این کار رو انجام میدم.
منتظر همچین حرکتی از سری شما که بنیانگذار اصلی این مجموعه توابع هستین بودن.
عالی بود. ممنون
سلام
من می خواهم به جدولم یک ستون اضافه کنم ولی ابتدا باید چک کند که این فیلد وجود دارد یا نه وهمچنین اگرکاید سمتریک منلا با نام xوجود ندارد آن کلیدرابسازد
خواهش می کنم زود تا۱-۶-۱۳۹۰جواب دهید
سلام. متاسفانه من حضور ذهن ندارم. همینجا پاسخ بدم. خودم همیشه به منوال مای اسکیوال مراجعه میکنم. پیشنهاد من به شما هم همین هست.
سلام
خیلی ممنون قشنگ بود برای ماه ها و تاریخ های قمری هم پیشنهادی دارید؟
متشکرم
سلام ممنون .
خیر جز اینکه توابع رو تغییر بدید. تا فمری رو بتونید خودتون بدست بیارید.
این یک پروژخ مربوط به ۲ سال پیش هست. فرصتی پیش نیومده تا الان مجدد کار کنم. اما با اومدن مای اسکیو ال ۵.۵ امکانات و دستورات خوبی رو ارائه داده. به زودی روش کار میکنم. اما به سمت قمری نخواهم رفت.
با سلام.
ممنون از زحمات شما بابت این توابع ضروری.
متاسفانه امکان import کردن این توابع در MYSQL هاست من خطای
#۱۵۴۸ – Cannot load from mysql.proc. The table is probably corrupted
رو نشون میده. لطفا راهنمایی کنید.
با تشکر.
درود بر شما. به احتمال زیاد نسخه مای اسکیوال شما قدیمی هست. و حتما از گیت هاب دانلودش کنید.
سلام
موقع وارد کردن تو دیتابیس پیغام زیر رو میده، ممنون میشم راهنمایی کنید
SQL query:
DELIMITER ; ;
CREATE DEFINER = `root`@`127.0.0.1` FUNCTION `__mydiv` (
`a` int,
`b` int
) RETURNS bigint( 20 ) BEGIN # Copyright (C) 2009-2011 Mohammad Saleh Souzanchi
# WebLog : http://www.saleh.soozanchi.ir
# Version V1.0.2
RETURN FLOOR( a / b ) ;
END ; ;
MySQL said: Documentation
#1418 – This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
سلام
من از MySQL 5.5.19 استفاده میکنم.
با تغییر DELIMITER ;; به DELIMITER $$ درست شد.
DROP FUNCTION IF EXISTS `__mydiv`;
DELIMITER $$
CREATE DEFINER=`root`@`127.0.0.1` FUNCTION `__mydiv`(`a` int, `b` int) RETURNS bigint(20)
BEGIN
# Copyright (C) 2009-2011 Mohammad Saleh Souzanchi
# WebLog : http://www.saleh.soozanchi.ir
# Version V1.0.2
return FLOOR(a / b);
END;;
DELIMITER ;
سلام
من بازم مشکل داشتم تا اینکه دستور زیر رو تو MySQL وارد کردم و درست شد.
SET GLOBAL log_bin_trust_function_creators = 1;
منبع : http://www.ispirer.com/doc/sqlways39/Output/SQLWays-1-365.html
لطفا از آخرین ورژن در گیت هاب استفاده کنید.