PDA

View Full Version : سوال: بهترین روش ذخیره تاریخ



mhsmity
پنج شنبه 26 مرداد 1391, 21:49 عصر
سلام بهترین راه برای ذخیره تاریخ (شمسی) جیست؟

راهنمایی کنید.

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

حالا بهترین روش تعریف این متغیر در Sql چیست؟

1- یک فیلد از نوع nvachr با طول 10 تعریف کنم؟
2- برای هر قسمت سال ماه روز یک فیلد تعریف کنم؟
3- آیا می توان یک فیلد داشت با سه قسمت داخل اون ؟
اگه کسی روش سوم رو داخل Sql می دونه کمک کنه؟

veniz2008
پنج شنبه 26 مرداد 1391, 21:57 عصر
سلام. نیازی به چند فیلد جداگانه نیست. همه مواردرو میشه با nvarchar پیاده سازی کرد. ولی اگه قراره nvarchar بزاری باید طولش رو 10 بزاری. برای بیرون کشیدن ماه یا سال میتونی از substring استفاده کنی. برای تفریق و جمع کردن تاریخ ها یه خورده کارت بیشتر میشه . ولی اگه از datetime خود sql استفاده کنی کارهات راحت تره و میتونی از توابع خود sql استفاده کنی. فقط موقع ذخیره کردن ( یا موقع خوندن) باید یک تبدیل به شمسی داشته باشی.

mousa1992
پنج شنبه 26 مرداد 1391, 21:58 عصر
تاریخو میلادی ذخیره کنید از نوع datetime و به راحتی هر عملیاتی رو روی اون انجام میدید ، جستجو کردن و تفریق کردن و میتونید فقط ماهشو بگیرید یا سال- روز و هر عملیاتی که مد نظرتونه و هنگام نمایش اونو تبدیل به شمسی میکنید

fjm11100
پنج شنبه 26 مرداد 1391, 22:21 عصر
اگر بصورت یک عدد 8 رقمی int ذخیره کنی سرچ و سورتش خیلی سریعتر میشه. ضمنا چرا nvarchar و چرا طول 10 مگه تاریخ 8 رقم نمیشه؟ نکنه میخواهید جداکننده های روز ماه سال را هم ذخیره کنید؟! ضمنا nvarchar نسبت به varchar سرعت را پایینتر میاره(اگر حجم خیلی زیاد باشه البته) و فقط بدرد unicode میخوره
اگر عدد ذخیره کنی کافیه توی برنامه string بشه و سال و ماه روز را با substring جداکنی و یا با insert بین آنها اسلش یا جداکننده خودت را بزاری.

samadblaj
پنج شنبه 26 مرداد 1391, 22:54 عصر
سلام منم یه سوال دارم:
توی برنامه تاریخ رو شمسی نمایش میدیم، و میخوام محاسبتی روی تاریخ داشته باشیم.
حالا بهتر هست هنگاه ذخیره کردن در پایگاه داده شمسی ذخیره کنیم یا میلادی؟

nilmil_nil
جمعه 27 مرداد 1391, 00:19 صبح
دوستان من خیلی وقته از char(10) برای برنامه هام استفاده میکنم و تاریخ رو هم شمسی ذخیره میکنم
تا حالا هم به مشکلی بر نخوردم
نه برای سورت نه برای جستجو

mhsmity
جمعه 27 مرداد 1391, 01:18 صبح
پس روش سوم که فیلدهای جند بخشی مثلا اینام ها رو که اصلا نداریم

پس بهترین راه برای ذخیره شمسی nvarchar با طول 10 هستش که تاریخ باید به فرمت 1391/05/27 باشد تا بتوان بعضی از عملیات های محاسباتی اس کیو ال رو روی اون انجام داد

آیا روش بالا بهترین روش هستش؟

samadblaj
جمعه 27 مرداد 1391, 01:46 صبح
نه اینجور که من برداشت کردم بهترین روش varchar(8) و فرمت ذخیره هم به صورت میلادی باشه بهتره (سرعت بیشتر در محاسبه).
یعنی برای نمایش از تابع Persian استفاده میکنیم. و هنگام ذخیره اطلاعات زمانی رو به صورت میلادی در دیتابیس ذخیره میکنیم، و محاسبات رو هم از روی همون تاریخ میلادی انجام میدیم، فقط یه Convert.

ولی به نظر من شمسی ذخیره کنیم راحتریم؟ آیا ذخیره شمسی مشکل داره؟

ali_habibi1384
جمعه 27 مرداد 1391, 09:52 صبح
نه اینجور که من برداشت کردم بهترین روش varchar(8) و فرمت ذخیره هم به صورت میلادی باشه بهتره (سرعت بیشتر در محاسبه).
یعنی برای نمایش از تابع Persian استفاده میکنیم. و هنگام ذخیره اطلاعات زمانی رو به صورت میلادی در دیتابیس ذخیره میکنیم، و محاسبات رو هم از روی همون تاریخ میلادی انجام میدیم، فقط یه Convert.

ولی به نظر من شمسی ذخیره کنیم راحتریم؟ آیا ذخیره شمسی مشکل داره؟
ميشه بگيد چطور سرعت بيشترش رو اندازه گيري كرديد!
اتفاقا نظر من بر عكسه استفاده از يه تابع واسه نمايش تاريخ! موقع سرچ يه تابع ديگه واسه تبديل تاريخ شمسي به ميلادي اووووووه اينا بنظر شما باعث افزايش سرعت ميشه نسبت به يك select معمولي؟؟؟
بهترين روش همون nvarchar(10) هست حداقلش من يكي توي 7-8 سال به مشكل نخوردم.

nilmil_nil
جمعه 27 مرداد 1391, 09:58 صبح
سلام
دوستان من از ذخیره تاریخ شمسی به صورت 1391/01/01 استفاده میکنم و از Char(10)
تا حالا به مشکلی بر نخوردم

samadblaj
جمعه 27 مرداد 1391, 10:18 صبح
ميشه بگيد چطور سرعت بيشترش رو اندازه گيري كرديد!
اتفاقا نظر من بر عكسه استفاده از يه تابع واسه نمايش تاريخ! موقع سرچ يه تابع ديگه واسه تبديل تاريخ شمسي به ميلادي اووووووه اينا بنظر شما باعث افزايش سرعت ميشه نسبت به يك select معمولي؟؟؟
بهترين روش همون nvarchar(10) هست حداقلش من يكي توي 7-8 سال به مشكل نخوردم.


ضمنا nvarchar نسبت به varchar سرعت را پایینتر میاره(اگر حجم خیلی زیاد باشه البته) و فقط بدرد unicode میخوره

جناب حبیبی اشاره کردم "اینجور که من برداشت کردم" از نظر دوستان...

و خودمم یقین دارم Unicode سرعت رو کاهش میده چون قدرت تحمل افزایش پیدا میکنه، این سرعت نا محسوس خودش رو خیلی نشون نمیده و با چشم نمیشه تشخیص داد...

veniz2008
جمعه 27 مرداد 1391, 10:26 صبح
سلام
دوستان من از ذخیره تاریخ شمسی به صورت 1391/01/01 استفاده میکنم و از Char(10)
تا حالا به مشکلی بر نخوردم
دوست عزیز این میتونه در یک حالت ما رو دچار مشکل کنه. اگه اعداد دریافتی از کیبورد بصورت فارسی باشن یعنی به جای مثلا 1376 تایپ کنه ۱۳۷۶ ، در اینحالت اگر اشتباه نکنم چهار تا علامت سوال درج میکنه که بعدا دیگه نمیشه کاریش کرد.(در مورد varchar هم وضع به همین منوال هست. اگر اشتباه میکنم لطفا تصحیح کنید) ولی اگه از nvarchar استفاده کنیم به همون صورت ۱۳۷۶ ذخیره میشه. البته این نکته رو هم باید در نظر بگیریم که بین 1376 و ۱۳۷۶ تفاوت وجود داره و موقع جستجو کردن به مشکل برمیخوریم مگر اینکه ورود داده هامونو به یک شکل واحد در بیاریم.

samadblaj
جمعه 27 مرداد 1391, 10:39 صبح
دوست عزیز این میتونه در یک حالت ما رو دچار مشکل کنه. اگه اعداد دریافتی از کیبورد بصورت فارسی باشن یعنی به جای مثلا 1376 تایپ کنه ۱۳۷۶ ، در اینحالت اگر اشتباه نکنم چهار تا علامت سوال درج میکنه که بعدا دیگه نمیشه کاریش کرد.(در مورد varchar هم وضع به همین منوال هست. اگر اشتباه میکنم لطفا تصحیح کنید) ولی اگه از nvarchar استفاده کنیم به همون صورت ۱۳۷۶ ذخیره میشه. البته این نکته رو هم باید در نظر بگیریم که بین 1376 و ۱۳۷۶ تفاوت وجود داره و موقع جستجو کردن به مشکل برمیخوریم مگر اینکه ورود داده هامونو به یک شکل واحد در بیاریم.

نه دوست عزیز nvarchar مناسب نیست چون بقول شما 1370 فارسی رو هم میپذیره پشتیبانی از فارسی Unicode اما varchar فقط به صورت لاتین کارکتر و اعداد رو ذخیره میکنه.

veniz2008
جمعه 27 مرداد 1391, 10:45 صبح
نه دوست عزیز nvarchar مناسب نیست چون بقول شما 1370 فارسی رو هم میپذیره پشتیبانی از فارسی Unicode اما varchar فقط به صورت لاتین کارکتر و اعداد رو ذخیره میکنه.
لطفا یه خورده قبل از اینکه پست بزنید فکر کنید. این بهتره که ۱۳۷۶ ثبت بشه یا ؟؟؟؟ (چهار تا علامت سوال) ؟. مطمئنا اگر بصورت فارسی وارد دیتابیس بشه بعدا میشه یه کاریش کرد تا همه تاریخ ها بصورت واحد بشن ولی اگه علامت سوال درج بشه اونوقت میخوای چکار کنی؟؟؟؟؟؟

samadblaj
جمعه 27 مرداد 1391, 11:02 صبح
دوست عزیز من خصوصیات متغییر رو توضیح دادم و زمانی که varchar ذخیره میشه طبیعتا باید نوع فرمت ذخیره هم کنترل شه.
روش مناسب ذخیره تاریخ میلادی هستش فقط برای نمایش یه convert میشه.
ذخیره به صورت varchar مستلزم صرف بار کمتر روی سیستم میشه عدم وجود اعراب کمتر در varchar و سرعت در عمل "زمان" که یک اصل حیاتی هستش.
ببخشید پست رفت به حاشیه.
موفق باشید

veniz2008
جمعه 27 مرداد 1391, 11:14 صبح
دوست عزیز من خصوصیات متغییر رو توضیح دادم و زمانی که varchar ذخیره میشه طبیعتا باید نوع فرمت ذخیره هم کنترل شه.
روش مناسب ذخیره تاریخ میلادی هستش فقط برای نمایش یه convert میشه.
ذخیره به صورت varchar مستلزم صرف بار کمتر روی سیستم میشه عدم وجود اعراب کمتر در varchar و سرعت در عمل "زمان" که یک اصل حیاتی هستش.
ببخشید پست رفت به حاشیه.
موفق باشید
نه اتفاقا چنین بحث هایی خیلی میتونه مفید باشه ( به شرطی که از ادب دور نشیم و علمی حرف بزنیم). همونطور که آقای حبیبی گفتن در مواردی که داده ها سنگین باشن میتونه تا حدودی روی سرعت تاثیر بذاره ولی در اینگونه موارد تاثیر آنچنانی نداره.

sm_1366
دوشنبه 09 تیر 1393, 20:08 عصر
واااا؟
منکه از نوع dateتعریف کردم ...تازه شمسی هم ذخیره کردم
اختلاف بین دو تا تاریخ هم میده بهم
دو روز به تاریخ روزم اضافه هم میکنه
حتی دیر کرد تاریخ ئهم میده ...
بحث های جالبی میبینه آدم اینجا
.....

...
.
.
.
. اصلاح میکگنم nvarchar

sh
دوشنبه 09 تیر 1393, 21:00 عصر
در پست شماره 3 جواب گفته شد
بهترین روش ذخیره تاریخ با هر شرایطی که به ذهن شما خطور کنه ، ذخیره تاریخ بر اساس تاریخ میلادی هست.
با استفاده از توابع تبدیل تاریخ دات نت یه کلاس برای تبدیل تاریخ بنویسید (به وفور در این انجمن پیدا میشه) بعد در زمان خواندن اطلاعات و قبل از ذخیره آن ، تغییرات مورد نظر را اعمال کنید.
همیشه دنبال راه حل ساده از قبیل فیلدهای رشته ای و غیره نباشید ، از اول کار را اصولی انجام بدین. سعی کنید کارهاتون استاندارد باشه

sm_1366
دوشنبه 09 تیر 1393, 21:38 عصر
در پست شماره 3 جواب گفته شد
بهترین روش ذخیره تاریخ با هر شرایطی که به ذهن شما خطور کنه ، ذخیره تاریخ بر اساس تاریخ میلادی هست.
با استفاده از توابع تبدیل تاریخ دات نت یه کلاس برای تبدیل تاریخ بنویسید (به وفور در این انجمن پیدا میشه) بعد در زمان خواندن اطلاعات و قبل از ذخیره آن ، تغییرات مورد نظر را اعمال کنید.
همیشه دنبال راه حل ساده از قبیل فیلدهای رشته ای و غیره نباشید ، از اول کار را اصولی انجام بدین. سعی کنید کارهاتون استاندارد باشه


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

plus
دوشنبه 09 تیر 1393, 22:13 عصر
به نظرتون من اشتباه کردم که از نوع date در نظر گرفتم و شمسی هم ذخیرش میکنم؟
بله.
شما تاریخ 1392/02/30 رو میتونید ذخیره کنید؟

sm_1366
دوشنبه 09 تیر 1393, 22:17 عصر
بله چرا که نه
30-02-1392

plus
سه شنبه 10 تیر 1393, 09:07 صبح
بله چرا که نه
30-02-1392
اول امتحان کنید بعد بگید بله.
ماه دوم میلادی روز 30 ام نداره و شما نمیتونید یک چنین تاریخی رو به عنوان تاریخ میلادی (در فیلد نوع date) ذخیره کنید.

sm_1366
سه شنبه 10 تیر 1393, 14:26 عصر
من عذر خواهی میکنم... برادر واقعا شرمنده من از نوع nvarchar گرفتم...ببخشید