PDA

View Full Version : سوال: آیا DateTime 2 نوع داده خوبی برای ذخیره ی رمان و تاریخ فارسی هست



milan2004
شنبه 13 آذر 1395, 15:15 عصر
سلام من میخوام زمان و تارخ فارسی وارد شده رو در دیتابیس ذخیره کن ایا Datetime2 نوع داده مناسبی هست ؟

Mahmoud.Afrad
دوشنبه 15 آذر 1395, 12:05 عصر
خیر مناسب نیست. بایست به نحوی تاریخ شمسی به میلادی تبدیل و بعد در ستونی از جنس datetime2 ذخیره شود. به صورت درونی در mssqlserver پیاده سازی نشده اما میتونید از طریق توابعی که قبلا در بخش sqlserver قرار داده شده استفاده کنید و یا تبدیل رو سمت برنامه انجام بدید.

milan2004
دوشنبه 15 آذر 1395, 15:42 عصر
مگر نوع داده datetime 2 از تاریخ 1/1/0001 تا 9999 را ساپورت نمیکند پس مشکلی برای دیتای ما پیش نمی آید.من بصورت دستی تاریخ فارسی را دادم بدون مشکل ذخیره میشود.پس ایردش چیست ؟

Mahmoud.Afrad
دوشنبه 15 آذر 1395, 19:13 عصر
نوع داده تاریخ در sqlserver از نوع میلادی (Gregorian) هست. (هجری قمری رو هم میشه ذخیره کرد که البته به تبدیل نیاز داره که به صورت درونی در sqlserver وجود داره ولی برای شمسی هنوز پشتیبانی صورت نمیگیره.)
https://msdn.microsoft.com/en-us/library/bb677335.aspx

اما در مورد اینکه تاریخ رو بدون تبدیل به میلادی وارد می کنید و خطایی نمیگیرید ، تضمینی وجود نداره که به درستی ذخیره شود و یا محاسبات به درستی انجام بگیره.
1- قطعا تاریخ 1395/09/15 شمسی با 1395/09/15 میلادی و یا هجری قمری متفاوت خواهد بود و صرف اطلاق تاریخ به همه این موارد به منظور یکسان بودن نیست. صرف اینکه این تاریخ رو با همین اعداد بتونید ذخیره کنید بمعنی این نیست که هر دو یکسان هستند. اگر هم اینکار رو بدون خطای زمان اجرا انجام بدید ولی قطعا خطای معنایی خواهید داشت.
2- تعداد روز برخی ماههای میلادی و شمسی متفاوت هست. تاریخ 1395/6/31 را سعی کنید به صورت رشته وارد فیلدی از نوع datetime2 کنید. در اینصورت به خطا خواهید خورد چون چنین روزی در تقویم میلادی وجود ندارد و sqlserver نمیتواند عمل parsing را انجام دهد (در فرمت Persian در ویندوز10 مشکلی نیست اما شما نمیتونید تضمین کنید همه کاربران شما ویندوز10 و فرمت فارسی رو انتخاب کنند. پس باید توسط کد در برنامه خودتون تاریخ رو به میلادی تبدیل و به دیتابیس ارسال کنید یا توسط فانکشن درون سرور انجام بدید)

(البته اگر در ویندوز 10 region را روی فرمت Persian تنظیم کنید در برنامه خودتون و یا ms sql management studio با ورود تاریخ شمسی ، تاریخ به معادل میلادی تبدیل و ذخیره خواهد شد.)



جدا از بحث بالا، نوع datetime2 انتخاب خوبی برای تاریخ+زمان هست اما باید مطمئن بشید داده درستی را در این ستون ذخیره میکنید.
اگر نیاز به زمان ندارید از نوع date استفاده کنید. اگر نیاز به تاریخ ندارید از نوع Time استفاده کنید.
از لحاظ فضای اشغالی هم بهینه تر از نوع رشته معمولی هستند.
http://stackoverflow.com/a/12364243

milan2004
سه شنبه 16 آذر 1395, 09:00 صبح
جناب آقای محمد افراد(اگر اشتباه نکنم که در غیر اینصورت عذر خواهی میکنم) پاسخ شما کاملا منطقی و قانع کننده می باشد و کمال تشکر را از شما دارم امید وارم همان گونه که به ما کمک می نمایید خدا در تمام مراحل زندگیتان یارو یاورتان باشد .