توابع تاریخ شمسی جهت استفاده در 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


65 دیدگاه در “توابع تاریخ شمسی جهت استفاده در Mysql

  1. سلام
    من وقتی فایل رو ایمپورت میکنم این خطا را میگره . ضمنا من از ومپ ۲.۲ استفاده میکنم .
    Error

    SQL query:

    DELIMITER ; ;

    CREATE DEFINER = `root`@`localhost` FUNCTION `__mydiv` (
    `a` int,
    `b` int
    ) RETURNS bigint( 20 ) BEGIN # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
    # WebLog : http://www.saleh.soozanchi.ir
    # Version V1.0.2
    RETURN FLOOR( a / b ) ;

    END ; ;

    MySQL said: Documentation
    #۱۴۱۸ – 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)

  2. سلام
    به نظر می‌رسه برای اینکه این مجموعه بتونه خوب استفاده بشه، باید:
    الف: قسمت definerها را اصلاح کرد. (در اصل باید حذفش کرد تا در همه بانک‌های داده قابل استفاده باشه)
    ب. تعریف توابع را اصلاح کرد و برای همه توابع شخصیت‌ش را مشخص کرد. این کار می‌تونه باعث افزایش راندمان توابع و بهبودامنیت توابع بشه.

  3. سلام
    من از 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 ;

  4. سلام
    موقع وارد کردن تو دیتابیس پیغام زیر رو میده، ممنون میشم راهنمایی کنید

    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
    #۱۴۱۸ – 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)

  5. با سلام.
    ممنون از زحمات شما بابت این توابع ضروری.
    متاسفانه امکان import کردن این توابع در MYSQL هاست من خطای
    #۱۵۴۸ – Cannot load from mysql.proc. The table is probably corrupted

    رو نشون میده. لطفا راهنمایی کنید.
    با تشکر.

    • سلام ممنون .
      خیر جز اینکه توابع رو تغییر بدید. تا فمری رو بتونید خودتون بدست بیارید.
      این یک پروژخ مربوط به ۲ سال پیش هست. فرصتی پیش نیومده تا الان مجدد کار کنم. اما با اومدن مای اسکیو ال ۵.۵ امکانات و دستورات خوبی رو ارائه داده. به زودی روش کار میکنم. اما به سمت قمری نخواهم رفت.

  6. سلام
    من می خواهم به جدولم یک ستون اضافه کنم ولی ابتدا باید چک کند که این فیلد وجود دارد یا نه وهمچنین اگرکاید سمتریک منلا با نام xوجود ندارد آن کلیدرابسازد
    خواهش می کنم زود تا۱-۶-۱۳۹۰جواب دهید

  7. روز خوش
    آقا صالح از اونجایی که خودتون تو کامنت ۱۶ گفتین که این اسکریپت توابع آزادن. من جسارت کردم و توابع تبدیل تاریخ شمسی به میلادی رو اضافه کردم و قدری اصلاحات دیگر روی اسکریپت اصلی انجام دادم و اون را در قالب مجوز gpl انتشار دادم.
    اگه راضی به اینکار نیستین اعلام کنید.
    دوستان عزیز هم اگه خواستن اسکریپت جدید رو داشته باشن به اینجا مراجعه کنن.
    http://spitman.azdaa.com/fa/?p=33
    اینم لینک دانلود
    http://spitman.azdaa.com/wp-content/uploads/code/pdate-mysql.sql

    • مهران عزیز من از اینکه مشکلات رو گزارش و در توسعه اون کمک کردید.
      ضمن اینکه هیچ مشکلی در عمل شما نیست. بسیار سپاس گزارم.
      فقط یک خواهش دارم. به دلیل اینکه روند تغییرات و توسعه این پروژه یکپارچه بشه من در گیت هاپ منتشرش کردم. ممنون میشم شما هم مواردی که در وبلاگتون ذکر کردید به همراه تعییرات در مخزن این پروژه منتشر کنید

  8. لطفا کامنت قبلی بنده رو حذف کنید.

    اشکال کاملا وارد هست.

    این قسمت:

    WHEN 12 THEN RETURN ‘بهمن’;
    WHEN 12 THEN RETURN ‘اسفند’;

    باید اصلاح بشه.

    لطفا فایل را اصلاح بفرمایید.

    phpkar :
    سلام و خدا یارتون
    مثل اینکه توی تابع pmonthname مشکلی هست. قسمت case تعداد ماهها (ماه یازدهم ۱۲ نوشته شده)
    ممنون

پاسخ دهید

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