PDA

View Full Version : سوال: اختلاف تاریخ شمسی



علی فتحی
چهارشنبه 28 خرداد 1393, 20:41 عصر
سلام:ل:
در بانک اس کیو ال دو تا فیلد تاریخ دارم و برای روز شمار اختلاف دو تاریخ از این کد استفاده کردم
DATEDIFF(DD, dbo.Table2.d1, dbo.Table4.d2)
حالا سوال: اگر فیلدهای بانک رو از نوع تاریخ بگیرم فرمت اون میلادی میشه و مثلا 31/2/93 رو ثبت نمیکنه . واگر از نوع متن بگیرم اختلاف درست نشون داده نمیشه
لطفا راهنماایی بفرمایید برای تاریخ شمسی در بانک چ کار میشه کرد؟

علی فتحی
چهارشنبه 28 خرداد 1393, 21:17 عصر
hdkl k,ki gxth k'hi ;kdn

elec60
چهارشنبه 28 خرداد 1393, 22:05 عصر
سلام:ل:
در بانک اس کیو ال دو تا فیلد تاریخ دارم و برای روز شمار اختلاف دو تاریخ از این کد استفاده کردم
DATEDIFF(DD, dbo.Table2.d1, dbo.Table4.d2)
حالا سوال: اگر فیلدهای بانک رو از نوع تاریخ بگیرم فرمت اون میلادی میشه و مثلا 31/2/93 رو ثبت نمیکنه . واگر از نوع متن بگیرم اختلاف درست نشون داده نمیشه
لطفا راهنماایی بفرمایید برای تاریخ شمسی در بانک چ کار میشه کرد؟

سلام،

تاریخ رو به صورت رشته و شمسی ذخیره کنید و اختلافشو تو خود برنامه با استفاده از کلاس PersianCalendar محاسبه کنین.

rasol_afkham
چهارشنبه 28 خرداد 1393, 22:18 عصر
تاریخ رو به میلادی تبدیل کن و در بانک ذخیره کن. و در برنامه دوباره اون رو به شمسی بر گردون.


using System.Globalzation;
int Year, Month, Day;
// شمسی به میلادی
DateTime dt = new DateTime(Year, Month, Day, new PersianCalander())
// میلادی به شمسی
PersianCalander pc = new PersianCalander()
Year = pc.GetYear(dt);
Month = pc.GetMonth(dt);
Day = pc.GetInMonth(dt);

علی فتحی
چهارشنبه 28 خرداد 1393, 22:18 عصر
نه من مثل برنامه نمونه که گذاشتم اختلاف هر ردیف رو جداگونه میخوام .میتونم با کد نویسی انجام بدم ولی من اختلافو توی بانک میخوام چون باید اختلاف بروز بشه یعنی تاریخ دوم تاریخ سیستم هستش که توی بانک قرار دادم.اگر با کد زخیره کنم برای روز بعد چگونه بروزش کنم .

nazanin366
جمعه 30 خرداد 1393, 23:36 عصر
به نظر من بهتره اختلاف تاریخ رو تو خود c# بدست بیاری اگه لازم بود اختلاف تاریخ رو تو دیتاتیبل ذخیره کن.از کد زیر هم میتونی استفاده کنی.اختلاف تاریخ برای سال کبیسه هم محاسبه میکنه.

khokhan
شنبه 31 خرداد 1393, 08:00 صبح
کسی نظر خاصی نداره؟
می شه تاریخ میلادی رو ذخیره کرد و همونجا توی sql یه فانکشن براتغییر وتبدیل نوشت که هم توی بانک و هم بیرون از بانک ازش استفاده کرد :لبخند: ............

این لینک رو ببین چه راحت این کارو کرده http://girlfromoutofthisworld.com/getting-shamsi-date-from-gregorian-date/

Amir4317
شنبه 31 خرداد 1393, 18:56 عصر
اختلاف متغیرهایی مثل تاریخ که همیشه در حال تغییر هستند را بهتره اصلاً در بانک ذخیره نکنید! :متعجب::متعجب:
تنها مقدار مبداً یا اولیه باید در بانک ذخیره بشه و در درون برنامه میزان اختلاف با مقدار دلخواه محاسبه و نمایش داده بشه. :چشمک:

علی فتحی
یک شنبه 01 تیر 1393, 00:36 صبح
من دو ستون تاریخ دارم یکی تاریخ واریز دیگری تاریخ امروز .اختلاف این دو تاریخ میشه روز شمار و ضرب در مبلغ میشه امتیاز
خوب برای تغییر اامتیاز روزانه .کل ستون روزانه باید تغییر کنه.
اهر نفر باید 20 حواله واریزی و برا 300 نفر6000 حواله میشه . پس عملیات اختلاف در سی شارپ علنن منتفی است.فقط و فقط باید بانک باشه
با میلادی این کارو کردم .فقط روز های 31 م را قبول نمیکنه

hamid_0341
یک شنبه 01 تیر 1393, 07:20 صبح
من دو ستون تاریخ دارم یکی تاریخ واریز دیگری تاریخ امروز .اختلاف این دو تاریخ میشه روز شمار و ضرب در مبلغ میشه امتیاز
خوب برای تغییر اامتیاز روزانه .کل ستون روزانه باید تغییر کنه.
اهر نفر باید 20 حواله واریزی و برا 300 نفر6000 حواله میشه . پس عملیات اختلاف در سی شارپ علنن منتفی است.فقط و فقط باید بانک باشه
با میلادی این کارو کردم .فقط روز های 31 م را قبول نمیکنه

با یک کلاس شمسی که قبلا هم توی سایت گزاشتم راحت میتونین به شمسی تبدیل کنی و اختلافشون رو بدست بیاری
یک سرچ کنی کلاسش رو میبینی

علی فتحی
پنج شنبه 19 تیر 1393, 21:33 عصر
نشد اجبارم یک پیام ایجاد کردم که این تاریخها وارد نشه . چ کار میشه کرد نتونستم به جوابم برسم

plus
پنج شنبه 19 تیر 1393, 22:06 عصر
من مشکل شما رو با ذخیره کردن تاریخ به صورت میلادی و بدست آوردن اختلاف با همون DATEDIFF نفهمیدم.

aslan
پنج شنبه 19 تیر 1393, 22:36 عصر
http://barnamenevis.org/showthread.php?60902-%D8%A8%D8%AF%D8%B3%D8%AA-%D8%A2%D9%88%D8%B1%D8%AF%D9%86-%D8%AA%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B1%D9%88%D8%B2%D9%87%D8%A7%DB%8C-%D8%A8%DB%8C%D9%86-%D8%AF%D9%88-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C-%D8%AF%D8%B1-SQL&p=306159&viewfull=1#post306159

علی فتحی
جمعه 20 تیر 1393, 02:37 صبح
من مشکل شما رو با ذخیره کردن تاریخ به صورت میلادی و بدست آوردن اختلاف با همون DATEDIFF نفهمیدم.

منظورم اینه نوع سلول بانک dateهستش نه char
تاریخ رو وقتی بصورت شمسی وارد میکنم روز 31/2/90 رو قبول نمیکنه

sadegh.javan
جمعه 20 تیر 1393, 03:15 صبح
دو تا نکته به نظرم رسید شاید کمک کنه :
اول اینکه همه تاریخ ها رو به میلادی ذخیره کنید اون وقت درست کار میکنه چون اختلاف تاریخ ربطی به شمسی و میلادی نداره . وقتی خواستید به کاربر نمایش بدید به شمسی تبدیلش کنید .
دوم اینکه متوجه نشدم چرا تاریخ روز جاری رو تو پایگاه داده ذخیره میکنید ؟ چرا از توابع سیکول استفاده نمیکنید ؟ :
GETDATE()
CURRENT_TIMESTAMP
http://msdn.microsoft.com/en-us/library/ms186724.aspx

plus
جمعه 20 تیر 1393, 13:44 عصر
منظورم اینه نوع سلول بانک dateهستش نه char
تاریخ رو وقتی بصورت شمسی وارد میکنم روز 31/2/90 رو قبول نمیکنه

خوب معلومه شما نمیتونید ستون رو Date بگیرید و تاریخ شمسی بهش بدین.تاریخ رو باید میلادی بدین. شما وقتی 90/2/31 وارد میکنی SQL تاریخ رو میلادی در نظر میگیره و چون ماه دوم میلادی 28 روزه تاریخ رو قبول نمیکنه.

علی فتحی
جمعه 20 تیر 1393, 14:07 عصر
تاریخ روز رو برای روز شمار حواله وارد میکنم اجباریه باید وارد بشه.

علی فتحی
جمعه 20 تیر 1393, 16:20 عصر
با تشکر از همگی از خیرش گذشتیم

علی فتحی
سه شنبه 31 تیر 1393, 23:37 عصر
بازم مثل همیشه ایجاد تاپیک و به نتیجه نرسیدن. واقعا اینجا چه خبره باید یه کلاس بزاری تازه طرف یاد بگیره و بفهمه ما چی پرسیدیم.بابا شاخ و دم نداره اختلاف یک ستون تاریخ با تاریخ سیستم.یا ستون دوم که تاریخ دوم داره

plus
چهارشنبه 01 مرداد 1393, 00:07 صبح
بازم مثل همیشه ایجاد تاپیک و به نتیجه نرسیدن. واقعا اینجا چه خبره باید یه کلاس بزاری تازه طرف یاد بگیره و بفهمه ما چی پرسیدیم.بابا شاخ و دم نداره اختلاف یک ستون تاریخ با تاریخ سیستم.یا ستون دوم که تاریخ دوم داره
دوست عزیز شما اگه یک مقدار خودتون فکر و تحلیل کنید بهتر نتیجه میگیری تا اینکه دنبال جواب آماده توی فروم باشی. ظاهرا شما دنبال یه جواب مثل این هستی که "ازین استفاده کن : MSSQL.SHAMSIDIFFPLEASE" که برای سوال شما چنین پاسخی موجود نیست.جواب شما به صورت تقریبا کامل ولی پراکنده در همین تاپیک داده شده. من کل موضوع رو یکبار دیگه شرح میدم.
و البته این پست من هم یک جواب آماده نیست فقط یک تحلیل روی مشکل شماست...
صورت مساله شما این هست: بدست آوردن اختلاف دو تاریخ شمسی که به صورت رشته ای هستن، با استفاده از دستورات MS SQL تماما در دیتابیس (بدون کد Managed).
خوب اولین راه حلی که برای بدست آوردن اختلاف دو تاریخ موجود هست مربوط به امکانات خود MS SQL و تابع DATEDIFF و ... هست که از اونجایی که شما تاریخ هاتون رو شمسی ذخیره میکنید، ممکن نیست.در واقع طراحی شما باعث شده که نتونید از راحت ترین و احتمالا سریع ترین روش استفاده کنید.صرفا تغییر نوع ستون به Date مشکل رو حل نمیکنه چون نوع Date مروبط به نگهداری تاریخ میلادی هست نه شمسی.
خوب حالا اگه شما نخواین طراحیتون رو تغییر بدین چه راهی میشه پیدا کرد؟
ازون جایی که شما تاریخ رو به صورت رشته ای ذخیره میکنید، جدا کردن روز، ماه و سال از تاریخ با توابع رشته ای به سادگی امکان پذیر هست. یعنی شما مولفه های تاریخ اول و دوم رو به راحتی میتونید محاسبه کنید.ولی مشکل اصلی سر بدست آوردن اختلاف هست..
ازون جایی که خود MS SQL هیچ امکانی رو برای بدست آوردن اختلاف دو تاریخ شمسی و یا تبدیل میلادی به شمسی ارائه نداده، راهی که به ذهن میاد این هست که شما خودتون باید با توجه به شرایطی که تقویم شمسی داره (با احتساب تعداد روز های ماه، سال های کبیسه و ...) الگوریتم بدست آوردن اختلاف رو به صورت یک FUNCTION با دستورات SQL بنویسید و ازش استفاده کنید.البته اگه شما الگوریتم تبدیل تاریخ شمسی به میلادی رو هم داشته باشید، میتونید تاریخ شمسی رو به میلادی تبدیل کنین و اختلاف رو با DATEDIFF بدست بیارین.
برای استفاده از راه حل دوم ظاهرا قبلا کسی برعکس این کار رو کرده.پست شماره 7 جناب khokhan لینکی دادن که میتونید بررسی کنید.البته بررسی اینکه دقیق کار کنه به عهده خودتون هست.شما نیاز دارین تا برعکس این کار رو انجام بدین...همونطور که میبینید چند ده خط کد هست و کاری که میخواین بکنین همچین بدون شاخ و دم هم نیست.
راه حل دیگه ای که به ذهنم میرسه، استفاده از SQL Server Common Language Runtime Integration هست.به این معنی که شما میتونید از NET. در MS SQL استفاده کنید.در این صورت باید بتونید از کلاس PersianCalendar (حین اجرای SQL Query) برای تبدیل تاریخ استفاده کنید.البته آشنایی با این روش ممکنه حسابی ازتون زمان بگیره و در کل زیاد توصیه نمیکنم.

خلاصه: راه حل های موجود،
1) تاریخ رو به صورت میلادی در ستون نوع Date دخیره کنید و با DATEDIFF اخلاف رو بدست بیارین (توصیه میشه).
2) پیاده سازی الگوریتم بدست آورد اختلاف دو تاریخ شمسی و یا الگوریتم تبدیل تاریخ شمسی به میلادی رو با زبان SQL (به صورت FUNCTION یا SP) بنویسید و یا بیابید (Google) و ازش استفاده کنید.
3) استفاده از CLR در MSSQL و کار با کلاس PersianCalendar.

علی فتحی
یک شنبه 05 مرداد 1393, 22:51 عصر
تشکر از همه دو کار کردم
تاجایی که حساب میکنه تاریخ رو شمسی ذخیره کردم مثلا 28/02/93 و سه روز بعدی رو بصورت دستی امتیاز دادم که حل شد
در یکی از نسخه ها هم تک تک توی یک فیلد گذاشتم روز-ماه-سال .با کوری اختلافو حساب کردم

Mahmoud.Afrad
یک شنبه 05 مرداد 1393, 23:23 عصر
تشکر از همه دو کار کردم
تاجایی که حساب میکنه تاریخ رو شمسی ذخیره کردم مثلا 28/02/93 و سه روز بعدی رو بصورت دستی امتیاز دادم که حل شد
در یکی از نسخه ها هم تک تک توی یک فیلد گذاشتم روز-ماه-سال .با کوری اختلافو حساب کردم
صورت مسئله رو پاک کردی بدون اینکه اشتباهت رو برطرف کنی.
شما ستون رو از نوع Date تعرفی کردی و میخوای تاریخ رو در قالب شمسی ذخیره کنی که از لحاظ منطقی کاملا اشتباه است چون شما اگر در این حالت اختلاف رو حساب کنی ، اختلاف بدست اومده برحسب تاریخ میلادی بدست میاد نه شمسی که احتمال خطا بالا هست.

دوستان راهنمایی کردند ولی گویا شما متوجه نشدی. وقتی نوع ستون رو Date انتخاب میکنی، زمانی ذخیره در دیتابیس در برنامه خودت، باید تاریخ شمسی رو اول به میلادی تبدیل کنی و بعد ذخیره کنی. در اینصورت میتونی از همون DateDiff استفاده کنی.

برای نمایش این تاریخ های میلادی هم کافیه اونو به شمسی تبدیل کنی که تا دلت بخواد در مورد تبدیل میلادی به شمسی در تالار T-SQL تاپیک هست.