این پروژه رو تقدیم می کنم به سازمان مدیریت برنامه نویسان php
در تمامی پروژههایی که نیاز به تاریخ شمسی است، عموما برنامهنویسان ایرانی با مشکلات خاصی ریز و درشتی روبرو هستند، بر ای مثال بهترین راهکار ذخیرهسازی تاریخ شمسی در یک جدول چیست؟
من در خیلی از تالارهای گفتگو، در پاسخ به این سوال، بارها و بارها دیدم که پیشنهاد شده برای ذخیرهسازی تاریخ و محاسبات دقیقتر بر روی فیلدهایی که نوع آنها تاریخ است، بهتر است که تاریخ را به صورت میلادی و از نوع فیلد timestamp ذخیره و نگهداری نمایید. چون این روش از هر لحاظ بسیار کارآمد و بهینهتر است. برای مثال ما میتونیم با داشتن یک تاریخ میلادی از نوع(timestamp)، براحتی تمامی تاریخهای دیگر همچون شمسی و قمری را استخراج کنیم. اما خب این روش نیز معایب خودش رو دارد. بزارید یک مورد از این معایب رو با بیان یک مثال مورد بررسی قرار دهیم.
همانطور که میدانید درMysql توابع بسیار خوب و کاربردی برای کار با مقادیر از نوع تاریخ و زمان وجود دارد که برنامهنویسان میتواند بدون درگیر شدن با کدنویسی و تنها با استفاده از یک تابع در کوئری خودشان سریع به نتیجه دلخواهشان برسند. به عنوان مثال فرض کنید ما میخواهیم یک آرشیو ماهیانه برای سیستم خبری ایجاد کنیم:
SELECT
YEAR ( created ) AS sal,
MONTH ( created ) AS mah,
COUNT( * ) AS visit
FROM
ips
GROUP BY
sal,
mah
ORDER BY
sal DESC,
mah DESC
برنامه نویس با مثال بالا به راحتی می تواند آرشیو ماهیانه مطالب سیستم خود را ایجاد کند. البته به میلادی.
اما برای آرشیو ماهیانه شمسی آیا جواب گو هست. جواب این هست. خیر!!!.
برای این خواسته توسعه دهندگان روشهای متنوع و مختلفی بسته به نوع نیاز خود بهره میگیرند. عدهای یک فیلد با جدول خود اضافه میکنند و مقادیر تاریخ شمسی را درج میکنند. عدهای دیگر مییابند تاریخ شروع مطالب. تاریخ پایانی رو پیدا میکنند. و بعد از تجزیه و تحلیل کردن آرشیو ماهانه را استخراج میکنند. تمامی روشهای موجود دارای پردازش کم و بیش بالایی هستند. تا به نتیجه دلخواه برسند.
من در این پروژه با استفاده از قابلیت تعریف پروسیجر و تابع که در نسخه ۵٫x.x به بعد ارائه شد. یک سری تابع ، همانند توابع MySql شبیه سازی کردم با این تفاوت که این توابع نتیجه را به صورت شمسی بر میگردانند.
در این پروژه توابع کاربردی date(),month(),year(), monthname() و … پیادهسازی شدهاند:
SELECT
pdate(NOW()), # 1400-08-22 00:12:18
pmonthname( NOW( ) ), # آبان
pdate( '1982-12-25' ),# 1361-10-04
pyear( '1982-12-25' ),# 1361
pmonth( '1982-12-25' ), # 10
pmonthname( '1982-12-25' ),# دی
gdate( 1361, 10, 4 ), # 1982-12-25 00:00:00
gdatestr( '1361/10/4' ); # 1982-12-25 00:00:00
برای استفاده از این توابع شما کافیست مراحل زیر را انجام بدید.
۱- دریافت فایل توابع : دریافت
۲- ایپورت کردن فایل در دیتابیس مورد نظر
بعد از انجام مراحل بالا برای تست توابع می تونید از این مثال استفاده کنید.
SELECT
pnum(pdate(NOW())),
pyear('2009-09-22'),
pmonth('2009-09-22'),
pmonthname( NOW());
مثال آرشیو ماهیانه
SELECT
pyear( created ) AS sal,
pmonth( created ) AS mah,
COUNT( * ) AS visit
FROM
ips
GROUP BY
sal,
mah
ORDER BY
sal DESC,
mah DESC
اگر نتیجه گرفتید. پس براحتی می توانید از این توابع کمال استفاده را ببرید.
نکته : در حال حاضر فقط این توابع را فقط می توان از نسخههای ۵.۱ و بیشتر مورد استفاده قرار داد.
جهت ادامه روند توسعه و رفع مشکلات این پروژه، من پروژه رو در github قرار دادم.