PDA

View Full Version : مبتدی: ذخیره دقیق تاریخ در sql



ghazal_mohammady
چهارشنبه 01 مرداد 1393, 13:51 عصر
عرض سلام و ادب
در برنامه ی من باید مقایسه ی خیلی دقیقی بین تاریخ روز و تاریخ موجود در دیتابیس انجام بشه و چنانچه روز فعلی با تاریخ موجود در دیتابیس یکی باشه به کاربر خبر بده:
1- واقعا تو دیتابیس تاریخ رو با چه نوعی باید ذخیره کرد و در سی شارپ ازش استفاده کرد و بالعکس، آخه هر کی یه چی میگه، میگن اگه date باشه تو یه تاریخ های شمسی گیر داره چون دیتابیس میلادیه؟
2- بهترین راه برای خبر دادن به کاربر چیه؟ یه جوری که حتما چنتا تأیید بگره ازش و بعد برنامه رو ببنده؟
با سپاس

Davidd
چهارشنبه 01 مرداد 1393, 14:35 عصر
اگه فقط در حد همين مقايسه تاريخ هست كه نياز به تاريخ شمسي نيست. از همون تاريخ ميلادي ميشه استفاده كرد و مشكلي بوجود نمياد. فقط در هنگام مقايسه بايد دقت كني چون DateTime علاوه بر تاريخ ساعت هم ذخيره ميكنه. اما اگه روي تاريخ پرس و جوهاي ديگه هم انجام ميشه يه راهش اينه كه به صورت char(10) مثل '1393/04/01' در ديتابيس ذخيره كني. كلاس هاي زيادي هم هست كه تاريخ ميلادي به اين فرمت تاريخ شمسي تبديل مي كنند.

ghazal_mohammady
چهارشنبه 01 مرداد 1393, 14:46 عصر
سپاس گزام، پس این که میگن nvchar باشه حتما چی؟
چطور میشه با همون میلادی مقایسه کنم؟ماه های 31 روزه چی میشه؟ بعد میخوام این تاریخ ها نمایش داده بشه به کاربرها، به شمسی...

Davidd
چهارشنبه 01 مرداد 1393, 14:52 عصر
خواهش ميكنم.
فرق nchar و char در اينه كه در nchar حروف يونيكد مثل اعداد فارسي ميشه ذخيره كر ولي در char فقط حروف انگليسي.
ماه هاي 31 روزه چه مشكلي داره؟ شما نياز به يك كلاس داري كه تاريخ ميلادي به شمسي تبديل كنه و بالعكس. مثلا كلاس هايي مال آقاي هادي اسكندري. وقتي ميخاي در ديتابيس ذخيره كني تاريخ ميلادي سيستم به شمسي تبديل ميكني و ذخيره ميكني. تبديلش كامله و سال كبيسه و ... در نظر ميگيره .

ghazal_mohammady
چهارشنبه 01 مرداد 1393, 14:56 عصر
خیلی ممنونم ، پس توی بانک نوع رو date بگیرم و تو سی شارپDateTime?
کلاس آقاي هادي اسكندري کجا میتونم پیداش کنم ؟

hadi vafaii
چهارشنبه 01 مرداد 1393, 15:14 عصر
منم این مشکل رو دارم:لبخندساده: با یکم تفاوت اینه که میخوام به طور اتوماتیک تاریخ تحویل یه جنس تو دیتابیس(اکسس) ذخیره بشه و تو گرید ویو نشون بده اگه میشه کمک کنین

mz6488
چهارشنبه 01 مرداد 1393, 15:52 عصر
من که تو پروژه های از فرمت 1393/05/01 استفاده میکنم.نوع فیلدش هم nvarchar(10)
فقط باید توجه داشته باشید که فرمتش همینجوری باشه.اگه مثلا یه به جای 03 در ج کنید 3 اونوقت موقع مقایسه با سایر رکوردها دچار مشکل میشه

ghazal_mohammady
چهارشنبه 01 مرداد 1393, 17:08 عصر
من که تو پروژه های از فرمت 1393/05/01 استفاده میکنم.نوع فیلدش هم nvarchar(10)
فقط باید توجه داشته باشید که فرمتش همینجوری باشه.اگه مثلا یه به جای 03 در ج کنید 3 اونوقت موقع مقایسه با سایر رکوردها دچار مشکل میشه

یعنی شما تاریخ روز رو می گیرین تبدیل به رشته ای با این فرمت میکنید و بعد ذخیره؟

Davidd
چهارشنبه 01 مرداد 1393, 22:39 عصر
من گفتم اگه فقط یه مقایسه هست همون date میلادی کفایت میکنه. اما با توجه به اینکه قراره تاریخ شمسی به کاربر نشون داده بشه و احتمالا کارای دیگه, بهتره از همون nchar(10) یا char(10) استفاده کنید (چون طولش همیشه 10 تاست نیاز به varchar نیست). در مورد تقویم آقای اسکندری هم تو اینجا یا گوگل جستجو کنید پیدا می کنید. با این کامپوننتا شما خیلی راحت میتونید تاریخ جاری سیستم به شمسی و با فرمت "1393/04/31" دریافت کنید و مستقیم در دیتابیس ذخیره کنید. به همین راحتی

mz6488
چهارشنبه 01 مرداد 1393, 23:56 عصر
یعنی شما تاریخ روز رو می گیرین تبدیل به رشته ای با این فرمت میکنید و بعد ذخیره؟

اره.معمولا تاریخ ها رو از طریق سه دونه تکست باکس میگیرم بعدش با یه متد میام اینا را وصل میکنم.بعدش تبدیل به رشته و ارسال به sql

ghazal_mohammady
پنج شنبه 02 مرداد 1393, 00:12 صبح
من گفتم اگه فقط یه مقایسه هست همون date میلادی کفایت میکنه. اما با توجه به اینکه قراره تاریخ شمسی به کاربر نشون داده بشه و احتمالا کارای دیگه, بهتره از همون nchar(10) یا char(10) استفاده کنید (چون طولش همیشه 10 تاست نیاز به varchar نیست). در مورد تقویم آقای اسکندری هم تو اینجا یا گوگل جستجو کنید پیدا می کنید. با این کامپوننتا شما خیلی راحت میتونید تاریخ جاری سیستم به شمسی و با فرمت "1393/04/31" دریافت کنید و مستقیم در دیتابیس ذخیره کنید. به همین راحتی

ممنونم ، گرفتم و موقع استفاده این ارور رو میده

The type or namespace name 'FarsiLibrary' could not be found (are you missing a using directive or an assembly reference?)
بجز فایل dll چیز دیگه ای هم باید اضافه کنم ؟

mz6488
پنج شنبه 02 مرداد 1393, 00:19 صبح
فکر کنم باید namespace رو using کنید

ghazal_mohammady
پنج شنبه 02 مرداد 1393, 00:34 صبح
فکر کنم باید namespace رو using کنید

نمیشه ، دستی هم میزنم قبول نمیکنه، من dllشو با راست کلیک کردن روی toolbox و Choositem انجام دادما، فقط هم dll ویندوز رو وارد کردم.

abbas.oveissi
پنج شنبه 02 مرداد 1393, 00:53 صبح
ممنونم ، گرفتم و موقع استفاده این ارور رو میده

The type or namespace name 'FarsiLibrary' could not be found (are you missing a using directive or an assembly reference?)
بجز فایل dll چیز دیگه ای هم باید اضافه کنم ؟
چرا از کلاس PersianCalendar که برای خود دات نت هست استفاده نمیکنید؟با استفاده از DateTime.Now زمان جاری رو بگیرید و با این کلاس تبدیلش کنید.
من خودم برای تاریخ از نوع Date یا DateTime استفاده میکنم.چون اگر رشته استفاده کنید توی بعضی کوئری ها یکم کار سخت میشه.زمان رو همه جا به میلادی ذخیره میکنم و فقط در زمان نمایش دادن به کاربر تاریخ شمسیش میکنم.

ghazal_mohammady
پنج شنبه 02 مرداد 1393, 00:59 صبح
چرا از کلاس PersianCalendar که برای خود دات نت هست استفاده نمیکنید؟با استفاده از DateTime.Now زمان جاری رو بگیرید و با این کلاس تبدیلش کنید.
من خودم برای تاریخ از نوع Date یا DateTime استفاده میکنم.چون اگر رشته استفاده کنید توی بعضی کوئری ها یکم کار سخت میشه.زمان رو همه جا به میلادی ذخیره میکنم و فقط در زمان نمایش دادن به کاربر تاریخ شمسیش میکنم.

ای خدا به خدا گیج شدم:ناراحت: هر بزرگواری اینجا یه روش رو پیشنهاد میکنه، تاریخ برای کار من بسیار بسیار بسیار مهمه، خواهش میکنم نتیجه ی نهایی رو بگین، روشی که مدتها کار شده و هیچ مشکلی ایجاد نشده، بخدا زمان برگشت برای طراحی ندارم:افسرده:

abbas.oveissi
پنج شنبه 02 مرداد 1393, 01:09 صبح
ای خدا به خدا گیج شدم:ناراحت: هر بزرگواری اینجا یه روش رو پیشنهاد میکنه، تاریخ برای کار من بسیار بسیار بسیار مهمه، خواهش میکنم نتیجه ی نهایی رو بگین، روشی که مدتها کار شده و هیچ مشکلی ایجاد نشده، بخدا زمان برگشت برای طراحی ندارم:افسرده:
حقیقت این هست ، توی بعضی مسائل راه های مختلفی هستند که شاید همشون هم درست باشند اما هرکی یک راه رو ترجیح میده.هر سوالی در این فروم بپرسید هرکی از دید خودش جواب میده البته این خودش یک خوبی داره که با راه حل های همه آشنا میشید.هر کدوم رو ترجیح میدید انتخاب کنید.

ghazal_mohammady
پنج شنبه 02 مرداد 1393, 01:14 صبح
حقیقت این هست ، توی بعضی مسائل راه های مختلفی هستند که شاید همشون هم درست باشند اما هرکی یک راه رو ترجیح میده.هر سوالی در این فروم بپرسید هرکی از دید خودش جواب میده البته این خودش یک خوبی داره که با راه حل های همه آشنا میشید.هر کدوم رو ترجیح میدید انتخاب کنید.

سپاس گزارم، شما که با این روش استفاده می کنین با ماه های 31 روزه مشکلی پیدا نکردین؟ نمایش تاریخ هم برام مهمه ها، من مبتدی هستم، و اگر روش ساده تری در حال حاضر باشه خب خیلی بهتره.

محمد آشتیانی
پنج شنبه 02 مرداد 1393, 01:20 صبح
سلام
وقتی کلاس Globalization دات نت هست لزومی نداره از کامپوننت های دیگه استفاده کنید.
ببینید خیلی سادست ، شما Type فیلدت رو (nvarchar(10 تعریف کن و تاریخ شمسی رو با فرمت YYYY/MM/DD توش بریز و برای مقایسه هم کافیه یه کوئری ساده بزنی

به این ترتیب:


SELECT * FROM YourTable WHERE YourDate = @YourDate

فرض شده اسم جدول شما YourTable و اسم فیلد تاریخ شما YourDate هست.
این کوئری تمام رکوردهایی که تاریخشون با تاریخ مورد نظر شما که بصورت پارامتر بهش ارسال می کنید یکسان هست رو برمی گردونه.


این تابع هم ورودیش تاریخ میلادی هست و خروجیش تاریخ شمسی با فرمتی که بالا عرض کردم



public string MiladiToShamsi(DateTime d)
{
PersianCalendar p = new PersianCalendar();
string Y, M, D;
Y = Convert.ToString(p.GetYear(d));
M = Convert.ToString(p.GetMonth(d)).PadLeft(2,Convert. ToChar("0"));
D = Convert.ToString(p.GetDayOfMonth(d)).PadLeft(2, Convert.ToChar("0"));
return Y + "/" + M + "/" + D;
}


کافیه System.Globalization رو توی کلاست اضافه کنی.

اینجوری هم تابعو استفاده کن:



maskedTextBox1.Text = MiladiToShamsi(DateTime.Now);




موفق باشید.

abbas.oveissi
پنج شنبه 02 مرداد 1393, 01:22 صبح
سپاس گزارم، شما که با این روش استفاده می کنین با ماه های 31 روزه مشکلی پیدا نکردین؟ نمایش تاریخ هم برام مهمه ها، من مبتدی هستم، و اگر روش ساده تری در حال حاضر باشه خب خیلی بهتره.
اگر مشکلی پیش بیاد ، تقصیر مایکروسافت باید باشه :لبخند: چون من برای تبدیل تاریخ از کلاس خود دات نت استفاده میکنم که درگیر اینجور مسائل نشم.بعد اگر استثنایی به ذهنتون میرسه ، تست کنید تا مطمئن بشید.بطور مثال یک تاریخ رو از شمسی ببرید به میلادی و دوباره برگردونید.کلا همچین تست هایی همیشه نیاز هست،مخصوصا اگر از کلاس هایی که توی اینترنت استفاده میکنید.برای چک کردن درستی هم از سایت هایی مثل Time.ir میتونید استفاده کنید.

ghazal_mohammady
پنج شنبه 02 مرداد 1393, 01:23 صبح
بسیار سپاس گزارم استاد آشتیانی، بهتره همین روش رو استفاده کنم، به احتمال زیاد تضمین شده است.
ممنونم جناب اویسی، کلا منو کامپوننت هیچ راهی برای ارتباط باهم نداریم، سپاس گزارم.

abbas.oveissi
پنج شنبه 02 مرداد 1393, 01:35 صبح
بسیار سپاس گزارم استاد آشتیانی، بهتره همین روش رو استفاده کنم، به احتمال زیاد تضمین شده است.
ممنونم جناب اویسی، کلا منو کامپوننت هیچ راهی برای ارتباط باهم نداریم، سپاس گزارم.
دست آقای آشتیانی درد نکنه که از کلاس PersianCalendar نمونه کد هم براتون گذاشتن.البته من توی دیتابیس از نوع Date یا DateTime استفاده میکنم.

کلا کامپوننت های کرک شده مشکلات خاص خودشون رو دارند.همیشه برای اینکه ریسک کرک کم بشه نباید از جدیدترین نسخه ها استفاده کرد،بعد اگر نسخه پایین استفاده کنی احتمال داره باگ های رفع نشده داشته باشند یا روی نسخه های جدید ویندوز پشتیبانی نداشته باشند.البته بعضی وقتها واقعا ضروری هست.من خودم مجبورم الان برای پروژه ام استفاده کنم. ولی برای کارهایی مثل تبدیل تاریخ که دات نت خودش کلاس داره،صد در صد بهتره از خود دات نت استفاده کنید.

plus
پنج شنبه 02 مرداد 1393, 01:41 صبح
سپاس گزارم، شما که با این روش استفاده می کنین با ماه های 31 روزه مشکلی پیدا نکردین؟ نمایش تاریخ هم برام مهمه ها، من مبتدی هستم، و اگر روش ساده تری در حال حاضر باشه خب خیلی بهتره.
اگه تاریخ رو به صورت "میلادی" در فیلد نوع Date ذخیره کنید مشکلی در مورد روز های 31 روزه پیش نمیاد. تاریخ شمسی فقط موقع نمایش و دریافت از کاربر استفاده میشه.