PDA

View Full Version : یه مشکل در تابع DateDiff



CodeMasterX
جمعه 21 اردیبهشت 1386, 22:23 عصر
همونطور که میدونید با تابع داخلی DateDiff میشه تعداد روزها،هفته ها،ماها و یا سالهای بین دو تاریخ رو مشخص کرد.
من توی یکی از برنامه هام که بانک اطلاعاتی هست،نیاز دارم تا با این تابع تعداد روزهای بین دو تاریخ رو بدست بیارم.تاریخ های بصورت شمسی در بانک ذخیره میشن و نوع فیلد ها هم رشته هست.از اونجایی که تابع DateDiff عملیت محاسبه رو بر اساس تاریخ میلادی انجام میده اگر تاریخ اول مثلا 1386/02/16 و تاریخ دوم 1386/02/30 باشه با خطای Type Mismatch مواجه خواهیم شد.دقیقا نمیدونم این مشکل کجاست،اگر مقدار روز تاریخ ها 29،30 و 31 باشه این خطا نشون داده میشه.یعنی تاریخ های میلادی این سه روز رو شامل نمیشن :گیج:؟

من سعی کردم تا خودم تابعی بنویسم تا کار DateDiff رو انجام بده ولی موفق نشدم خروجی درستی تولید کنم.دوستان اگر کسی میتونه راه حلی برای این خطا بده و یا تابعی بنویسه که درست خروجی بده ممنون میشم.

mohammadhadi
شنبه 22 اردیبهشت 1386, 09:19 صبح
بهتر بود تو برنامه ات به استفاده از تاریخ شمسی به صورت رشته ای از این تاریخ در قالب Date استفاده می کردی . در این صورت کار با تاریخ خیلی خیلی نسبت به اونچه شما الان انجام می دی راحتتر .
کافی بود تو برنامه ات یک تابع تبدیل تاریخ میلادی به شمسی استفاده می کردی .
من یک مدل برات می زارم و می دونم که به درت میخوره . فقط کافیه خروجی این تابع که به صورت رشته ای هست رو با تابع CDate به تاریخ تبدیل کنی یا اینکه حتی تاریخی رو که خودت داری با این تابع تبدبل کنی و بتونی در DateDiff استفاده کنی.

Mbt925
یک شنبه 23 اردیبهشت 1386, 17:07 عصر
بهترین و ساده ترین راه اینه که تاریخ رو به میلادی تبدیل کنین و بعد از این تابع استفاده کنید.

CodeMasterX
دوشنبه 24 اردیبهشت 1386, 00:58 صبح
بهترین و ساده ترین راه اینه که تاریخ رو به میلادی تبدیل کنین و بعد از این تابع استفاده کنید.

دوست عزیز شما مثل اینکه اصلا تاحالا با تاریخ های شمس و هجری کار نکردی.اگر تاریخ شمسی رو به میلادی تبدیل کنیم و بعد محاسبه ای رو انجام بدیم میدونی چه فاجعه ای به بار میاد ؟

و در جواب به دوستمون تو پست قبلی:

ببینم منطورت چیه ؟ مثل اینکه شما پست اول رو درست نخوندی.


مشکل حل شد.آقای پیام مرادی یه کنترل به اسم Payam Calendar Library تو همین بخش گداشتن که همه این بند و بساط ها رو انجام میده.

Mbt925
دوشنبه 24 اردیبهشت 1386, 09:12 صبح
دوست عزیز شما مثل اینکه اصلا تاحالا با تاریخ های شمس و هجری کار نکردی.اگر تاریخ شمسی رو به میلادی تبدیل کنیم و بعد محاسبه ای رو انجام بدیم میدونی چه فاجعه ای به بار میاد ؟


مشکلی که گفتین یه راه دیگه هم داره ، اینکه اون 3 روزی که گفتین رو برای تابع ارسال نکنید.
یعنی اگه بزرگتر از 28 بودن ، اختلافشون رو تا 28 ذخیره کنین و بعد از تبدیل بهش اضافه کنین.

در ضمن ماه دوم میلادی (February)
28 روزه هست ، واسه ی همین برای این ماه روزای بزرگتر از 28 رو قبول نمی کنه.

چه فاجعه ای پیش میاد؟

CodeMasterX
سه شنبه 25 اردیبهشت 1386, 23:53 عصر
دوست عزیز منظور من از فاجعه این بود که تاریخ ها رو در بانک میلادی ذخیره کنیم و بعد برای مقایسه دوباره به شمسی تبدیل کنیم و بعد محاسبات رو انجام بدیم. که مسلما با این روش تاریخ ها و خروجی های مطلقا درستی تولید نمیشه.

__H2__
چهارشنبه 26 اردیبهشت 1386, 13:10 عصر
سلام
سعی کنید تمام مقایسه ها و پردازش ها را با خود تاریخ های میلادی انجام دهید و فقط در زمان نمایش به کاربر و گرفتن از کاربر یک تبدیل روی آن صورت دهید.

وگرنه مشکل مذکور در ماه های دیگر نیز ادامه می یابد و تازه باز هم جواب درستی نمیدهد چون پردازش هر موقع مجبور به شکستن ماه به تعداد روز شود این کار را با منطق شمسی انجام نمیدهد مثلاً تاریخ 10/12/1386 و 20/10/1385 را در نظر بگیرید ماه 12 ام تاریخ اولی باید شکسته شود و این کار به درستی انجام نمیشود و...

Mbt925
چهارشنبه 26 اردیبهشت 1386, 17:47 عصر
فکر نکنم فاجعه ای پیش بیاد ، این کارو یه تابع توی 1 خط انجام میده.

CodeMasterX
چهارشنبه 26 اردیبهشت 1386, 20:12 عصر
Mbt جان شما مثل اینکه براتون سوء تفاهمی پیش اومده.
اگر شما تواریخ رو بصورت میلادی ذخیره کنی و بعد محاسبات رو روی همون تواریخ میلادی انجام بدی و بخوایی نتایج رو به تاریخ شمسی تبدیل کنی اصلا خروجی های درستی به شما نمیده.
مثالش رو که خودتون زدین.مثلا در بعضی ماه های میلادی روزهای 28،29 و 30 وجود نداره،سالهای کبیسه و ..... .

به هر حال ادامه این تاپیک منطقی نیست،جواب درست رو از کنترل Payam.Calendar.Library گرفتم.

Mbt925
پنج شنبه 27 اردیبهشت 1386, 10:52 صبح
منظوروم ذخیره میلادی تاریخ نبود.
منظورم این بود که تابعی که قرار اختلاف تاریخ ها رو محاسبه کنه از تبدیل استفاده کنه.

بله درست می گین ، دیگه کافیه.