mprog

استفاده از تاریخ جلالی در دیتابیس مرسوم هست؟

mprog ۱۳۹۷/۱۱/۰۱ مباحث عمومی دیتابیس

میشه تاریخ رو جلالی در دیتابیس دخیره کرد و اگه شدنی باشه برای مقایسه تاریخ ها و مرتب کردنشون مشکلی پیش نمیاد؟

پاسخ‌ها به این تاپیک
سهراب عسکرزاده
سهراب عسکرزاده برنامه نویس وب و ویندوز
۱۳۹۷/۱۱/۰۸

سلام،
در اکثر موارد در یک سیستمِ نرم افزاری شما به گزارشگیری یا چینش بر اساس تاریخ نیاز خواهید داشت و این کار با نوع داده Date بسیار راحت تر خواهد بود و همه کامپوننت هایی که ممکنه بعدا به سیستم اضافه بشن از این نوع داده پشتیبانی خواهند کرد.
بر این اساس طبیعتا در مورد هر تاریخی که دیتابیس شما مستقیما اون تایپ رو پشتیبانی نمیکنه(شمسی، جلالی و ...) معمولا انتخاب معقول اینه که شما نوع داده میلادی ذخیره کنید و بعد از توابع تبدیل تاریخ میلادی به شمسی و برعکس استفاده کنید.

استفاده از تاریخ شمسی یا جلالی معمولا برای نمایش به کاربر یا دریافت از کاربر استفاده میشه نه سورت کردن، پس ذخیره کردن اون به صورت پشت سر هم 970225 بنظرم کاربردی نباشه.
بعضی ها هم برای تاریخ در هر جدول دو فیلد شمسی و میلادی با نوع داده رشته متن و تاریخ در نظر میگیرند و هر زمان که میلادی آپدیت شد شمسی (یا جلالی) رو هم تبدیل و آپدیت میکنند که فراخوانیشون راحت تر بشه که من خوشم نمیاد از این روش چون کار اضافه انجام میشه و همینطور به دیتابیس هم درخواست اضافی فرستاده میشه، اما شاید برای بعضی ها راحت تر بنظر بیاد.


یک مدت هم پیشنهاد میشد که از نوع DateTime2 استفاده بشه که در بعضی از دیتابیس ها اجازه ذخیره به فرمت شمسی رو کاربرا میداد و بعد از مدت کوتاهی دیده شد چون Validation این تایپ بر اساس تاریخ میلادی هست ترتیب رو درست میگیره و تو سال مشکلی پیش نمیاد اما ماه 31 روزه رو نمیشه ذخیره کرد(ماه 31 روزه میلادی نداریم). این رو عرض کردم که اگر به نوع داده جدیدی در جستجو برخوردید این مورد رو چک بفرمایید.

پیشنهادم همون روش اول هست. توابع تبدیل شمسی به میلادی و برعکس با جستجو برای هر زبانی بدست میان برای جلالی هم من ننوشتم اما فکر نمیکنم اگر نمونه های موجود در نت رو مطالعه کنید به مشکل خاصی بر بخورید.
در دات نت هم که اطلاع دارم در فضای نامِ System.Globalization از کلاس PersianCalander که خود دات نت در اختیار گذاشته میتونید استفاده کنید برای تبدیل شمسی و میلادی یا بعنوانِ یک نمونه کلاسِ تبدیل تاریخِ استاندارد و اگرم میخواید خودتون بنویسید این کلاس یا توابع مشابه رو مطالعه کنید تا دیدتون بیشتر بشه.

یه نکته کوچیک دیگه برای مکان پیاده سازیِ تبدیل تاریخ ها این که بهتره چند تا ExtensionMethod کوچیک بنویسید که با استفاده از کتابخانه مورد استفادتون تبدیل رو انجام بده تا در جا بتونید از Date خروجی شمسی یا جلالی بگیرید و تبدیل رو توی لایه منطق ننویسید که در آینده اگر جایی نیاز بود سمت لایه نمایش هم داده میلادی داشته باشید به مشکلی برنخورید.

موفق باشید.

mprog
mprog
۱۳۹۷/۱۱/۰۲

ممنون از پاسختتون

در پاسخ به

علیرضا توکلی
علیرضا توکلیsenior web developer at tda.co
۱۳۹۷/۱۱/۰۲

مرسوم بودن که بستگی به خودت داره که چجوری بخوای ذخیره کنی

یه عده میان تاریخ رو تبدیل به عدد میکنن یعنی 1397/11/02 ساعت 07:30 دقیقه رو میکنن 139711020730 که اینطوری میشه راحت مقایسه و مرتب کردن رو انجام بدی ولی خودت باید هندل کنی

عده ی دیگری ساعت و زمان را به دو رشته 10 کاراکتری و5 کاراکتری تقسیم میکنن یعنی 1397/11/02 و 07:30 که باز هم مقایسشون ممکن هست ولی زمان جدا تاریخ جدا (میتونی مثل بالا جداگانه عدد بکنی 13971102 و 0730)

عده قلیلی (مثل بنده!) تابع تبدیل رشته شمسی به datetime و بالعکس نوشته اند که باعث میشه بتونی زمان شمسی رو در دیتابیس ، میلادی ذخیره کنی . خوبی این روش اینه که میتونی از تمامی توابع از قبل تعریف شده دیتابیس برای مقایسه و... راحت استفاده کنی

راه آخر راه سخت تر برای پیاده سازی هست ولی در آینده راحت تر و توسعه پذیر تر هست قطعا

mprog
mprog
۱۳۹۷/۱۱/۰۲

منم راه آخر مد نظرم بود و دلیلم هم همین بود

ولی مطمئن نبودم راه مناسبش باشه

ممنون از جوابتون

در پاسخ به