PDA

View Full Version : Data Type مناسب برای فیلد تاریخ (Date) چیست؟



rd.net
شنبه 22 اسفند 1388, 16:12 عصر
با سلام خدمت دوستان.
من میخوام تو sqlserver یه فیلد تارخ داشته باشم.حلا باید توی date type کدوم رو انتخاب کنم.؟؟؟؟
و میخوام تایخ به صورت short date باشه.1388/8/8
تو اکسس date رو انتخاب میکنی و راحت کارتو انجام میدی.

bad_boy_2007
شنبه 22 اسفند 1388, 21:18 عصر
smallDatetime ساعت را هم با دقت دقیقه ذخیره میکند

rd.net
یک شنبه 23 اسفند 1388, 01:24 صبح
با تشکر ازشما.
ولی من تاریخ خالی رو میخوام.
1388/8/8

setak
یک شنبه 23 اسفند 1388, 10:06 صبح
اگر از دات نت استفاده مي كني بهتره كه از user defined datatype استفاده كني و يك ديتاتايپ خودت در sql server درست كني

rd.net
یک شنبه 23 اسفند 1388, 10:42 صبح
من از vb استفاده میکنم.
چه طوری باید data type درست کنم.

setak
یک شنبه 23 اسفند 1388, 12:07 عصر
vb.net يا vb استفاده مي كنيد؟

rd.net
یک شنبه 23 اسفند 1388, 13:23 عصر
vb.visual basic 6

Jozef
یک شنبه 23 اسفند 1388, 13:39 عصر
یه متغیر nchar(10) انتخاب کنین.
و همیشه تاریخ رو به صورت کامل ذخیره کنین.
YYYY/MM/DD = 1388/01/01

rd.net
یک شنبه 23 اسفند 1388, 17:47 عصر
این کارو میشه کرد.ولی یه اشکال داره.زمانی که بخوای یه سری عملیات با تاریخ بکنی به اشکال بر میخوری.
مثلا جستجو بین دو تاریخ مشخص.

mgh64120
یک شنبه 23 اسفند 1388, 20:00 عصر
سلام
من قبلا از Date استفاده كردم ولي چون برخي از روزهاي تاريخ شمسي در تاريخ ميلادي نبود پيغام خطا ميداد.
من تو برنامم از ديتاتايپ Int استفاده كردم. براحتي Sort ميشه و براي جستجو هم مشكلي ندارم و براي نمايش توي محيط برنامه هم اون رو با تابع فرمت بصورت زير نمايش ميدم.



Format(Value, "####/##/##")


هم توي گريد و هم ليبل.
موفق باشي :چشمک:

rd.net
یک شنبه 23 اسفند 1388, 21:48 عصر
سلام
من قبلا از Date استفاده كردم ولي چون برخي از روزهاي تاريخ شمسي در تاريخ ميلادي نبود پيغام خطا ميداد.
من تو برنامم از ديتاتايپ Int استفاده كردم. براحتي Sort ميشه و براي جستجو هم مشكلي ندارم و براي نمايش توي محيط برنامه هم اون رو با تابع فرمت بصورت زير نمايش ميدم.



Format(Value, "####/##/##")

هم توي گريد و هم ليبل.
موفق باشي :چشمک:
این کد رو کجا نوشتی. میشه یه مثال کوچیک بذاری.ممنون میشم.
sql server, data type, date خالی نداره.
یعنی small datetime داره.time هم ذخیره میشه.
در ضمن دیتا تایپ از نوع اینت (/) رو نمیتونه ذخیره کنه.

Jozef
یک شنبه 23 اسفند 1388, 22:08 عصر
این کارو میشه کرد.ولی یه اشکال داره.زمانی که بخوای یه سری عملیات با تاریخ بکنی به اشکال بر میخوری.
مثلا جستجو بین دو تاریخ مشخص.
اگر تاریخی که ثبت میکنی همگی 10 حرف رو داشته باشه، برای جستجو هیچ مشکلی نخواهید داشت.
من زمان زیادی با این روش کار میکنم ولی مشکلی ندارم.

sia_2007
یک شنبه 23 اسفند 1388, 22:20 عصر
ببینید در پروژه های کوچک و متوسط، یک Shamsi User Defined Type که توسط کد Net. ساخته میشود، مثلا VB.Net یا #C ، بسیار کارگشاست.
شما میتوانید انواع و اقسام متدها چه برای Object و چه Static داشته باشید و خلاصه هر هنری را که بلدید میتوانید پیاده سازی کنید.
خوبی این روش این است که در صورتی که سر سرور خلوت باشد، میتوان تمامی محاسبات را در سرور انجام داد و از انتقال بیهوده اطلاعات جلوگیری نمود.
---
اما در سیستم های بزرگ از nChar 10 استفاده میشود.
و 3 فیلدی که خودشون خودشون رو محاسبه میکنند، Computed
و پس از محاسبه اطلاعات رو ذخیره میکنند Persisted
میگذاریم و روی تک تک اینها ایندکس میگذاریم.
---
روش دیگه که معمولا توصیه نمیشه اینه که از تایپ های میلادی خود SQL استفاده کنیم، که در صورتی که بخواهیم از Fun در خود SQL برای محاسبات استفاده کنیم، عملی زمانگیر است و Fun ها کندند.
و اگر بخواهیم دیتا را برای محاسبات به کلاینت بفرستیم، جا به جایی زیاد دیتا رخ میدهد.
---
در کل به شما توصیه میکنم برای پیشرفت به VB.Net مهاجرت کنید.
این کاریه که من کردم و بعد از اون هم به #C رفتم.
موفق باشی

sia_2007
یک شنبه 23 اسفند 1388, 22:20 عصر
کاری هم که این دوستمون انجام دادند اینه که فکر کنم از کلاس String.Format استفاده کردند.
در .ToString() بعضی از کلاسها هم چنین فرمت گیری وجود دارد.

rd.net
یک شنبه 23 اسفند 1388, 23:03 عصر
اگر تاریخی که ثبت میکنی همگی 10 حرف رو داشته باشه، برای جستجو هیچ مشکلی نخواهید داشت.
من زمان زیادی با این روش کار میکنم ولی مشکلی ندارم.
منظور از جستجو یعنی فلان نامهایی که از فلان تاریخ تا فلان تاریخ ثبت نام شده اند.
select *from table where date between date1 and date2

Jozef
دوشنبه 24 اسفند 1388, 09:55 صبح
منظور از جستجو یعنی فلان نامهایی که از فلان تاریخ تا فلان تاریخ ثبت نام شده اند.
select *from table where date between date1 and date2
اگر تمام تاریخ های ثبت شده 10 حروف را کامل داشته باشند، وقتی بین دو تاریخ جستجو کنین، درسته داره رشته مقایسه میکنه ولی هیچ مشکلی نخواهید داشت.
امتحان کنین.

روش 2:
میتونین هم به صورت عدد ذخیره کنین. اون وقت برای ثبت باید / رو حذف و بعد ذخیره کنین. مثلا 01/01/1388 را 13880101 ذخیره کنین. و همچنین برای نمایش باید دوباره / رو به تاریخ اضافه کنین. من این روش رو توصیه نمیکنم.

روش 3:
یه روش دیگه هم اینه که نوع Date انتخاب کنین و تاریخ فارسی رو از کاربر دریافت و به تاریخ میلادی تبدیل کنین و تاریخ میلادی رو ثبت کنین. و هر جا که با تاریخ سر و کار دارین یه تبدیل فارسی به میلادی یا برعکس انجام بدین. الگوریتمش هم فراوونه. باز این روش رو از روش ثبت عدد بهتر میدونم.
حالا خودتون امتحان کنین ببینین کدوم روش بهتره؟

sds1920
دوشنبه 24 اسفند 1388, 11:46 صبح
به نظر من بهترين انتخاب همونيه که دوستون Jozef مي گه توصيه نمي کنم.
يعني اينکه تاريخ رو به صورت يک عدد int توي بانک ذخيره کني.
حالا يه مقايسه کوچولو براي سه روش بالا :
روش اول بدترين روش ممکنه.چون مي خواي يک تاريخ را با 10تا کاراکتر ذخيره کني .ديتابيس ها براي اينکه بتونن تمام زبانهاي دنيا را پشتيباني کنند بايد حداقل براي هر کاراکتر 2 بايت در نظر بگيرند.چون با يک بايت که نمي شه 256 کاراکتر بيشتر داشته باشي و اونم فقط کاراکترهای پایه می شه مثل اعداد و حروف انگلیسی و...
پس اگه بخواي تاريخ را با 10کاراکتر ذخيره کني يعني بايد 20 بايت از فضا را اشغال کني در صورتي که اگه از نوع int انتخاب کني فقط 4 بايت نياز داري يعني 16 بايت به نفعت مي شه.
ممکنه بگی مگه 16 بایت چقدر فضاست که بخاطرش نگران باشم ولی فرض کن که جدول تو توي ديتابيس 100000 رکورد داشته باشه که مجبوري همه اونها را Load کني.اونوقت 1.53MB فضا اضافي را بايد به خاطر اين انتخاب متحمل بشي.اصلا گور باباي فضای اضافی توی این زمونه که هاردها و Ram ها با ظرفیت زیاد و قیمت ارزون هست.مي دوني چقدر زمان مي بره تا اين مقدار اطلاعات اضافی بخواد از هارد به Ram منتقل بشه.خيلي که ايده آل باشه چيزي حدود نيم ثانيه .که مطمئنا بيشتر از اين ها طول مي کشه .البته اين رو هم در نظر داشته باش که اين زمان اختلاف زمانيه که به خاطر انتخابت بايد هزينه کني يعني چيزي اضافه تر از اوني که بايد هزينه کني.اگه زمان انتقال ساير فيلدها رو هم حساب کني مي بيني که براي Load شدن تمام اطلاعات بايد چيزي حدود 8 ثانيه زمان صرف کني که اصلا به صرفه نيست.
علاوه براين اگر تاريخ به صورت رشته باشه هزينه مقايسه کردن و Sort و Serach اون را هم بايد بدي که خيلي بيشتر از هزينه مقايسه براي int است.

و اما روش سوم.
روش سوم بهتر از روش اول هست ولي باز هم يه کم ايراد داره.
اولا همون بحث فضای اضافی و ... هست که مطرح شد.چون فضایی که یک فیلد Date می گیره مطمئنا بیشتر یک عدد int است .
از طرفی تاریخ میلادی با تاریخ شمسی متفاوت است و امکان بروز خطا در آینده وجود داره که نمی شه این مسئله رو به سادگی ازش گذشت حتی اگه 1٪ احتمال خطا داشته باشه.چون اگه تو بهترین برنامه رو بنویسی با بهترین الگوریتمها ولی نتونی صحت داده هات رو تضمین کنی و اون را به احتمال و توکل به خدا واگذار کنی به نظر من سر سوزنی اون برنامه ارزش نداره حتی اگه فقط یکی از رکوردهات مشکل داشته باشه و بقیه هیچ ایرادی نداشته باشند و یا اصلا هیچ رکوردی مشکل نداشته باشه باز هم قابل قبول نیست.چون کامپیوتر که چیزی حالیش نیست و تمام کارها اگه بخوای خوب جواب بده باید قطعی باشه نه محتمل.

من خودم روش دوم یعنی یک عدد Int (مثل 13881209) را امتحان کردم و جواب گرفتم.برای مسائلی مثل Sort و Search هم هیچ مشکلی نداره و به خوبی کار می کنه.البته این رو بدون هر انتخابی توی این دینا هزینه خودش رو داره.
درست که این روش فضای اضافی اشغال نمی کنه و احتمال خطا هم نداره ولی هزینه ای داره.هزینه اونم اینه که موقع Load کردن تاریخ از بانک به برنامه باید اون را به فرمت 09/12/1388 در بیاری و هنگام ذخیره در بانک عکس این عمل را تکرار کنی .که اگه این هزینه رو با روش سوم مقایسه کنی می بینی که تقریبا با تغییراتی که باید بدی تا در تاریخ میلادی رو به تاریخ شمسی ذخیره کنی برابره.
دیگه انتخاب با خودته که کدوم روش رو انتخب کنی.:لبخندساده:

Jozef
دوشنبه 24 اسفند 1388, 15:38 عصر
با تشکر از دوست عزیزمون sds1920
سه روشی که گفتم هر کدوم نسبت به هم مزیت و معایبی دارن
روش اول عملیات تبدیل موقع ذخیره و بازیابی نداره ولی موقع جستجو هزینه اش از دو روش دیگه بیشتره.
روش دوم و سوم عملیات تبدیل موقع ذخیره و بازیابی دارن ولی خب موقع جستجو هزینه کمتری نسبت به روش اول دارن.
خارج از بحث :
در ضمن هر برنامه نویسی روش خودشو داره با طرز فکر خودش.
دوستان در مورد این سه روش خودشون تصمیم بگیرن.
تنوع از ما انتخاب از شما:لبخند:
قرار نیست منه نوعی نظر کسی رو عوض کنم. قراره تبادل نظر داشته باشیم.

Majid&Masoud
سه شنبه 25 اسفند 1388, 18:19 عصر
سلام
چرا یه Sql Server 2008 نصب نمیکنی که هم Date رو پشتیبانی میکنه هم تاریخ شمسی رو؟
دیگه این دردسرای 2000 و2005 رو هم نداره

rd.net
چهارشنبه 26 اسفند 1388, 09:04 صبح
اگه اینطور باشه خیلی خوبه.

Davood_amega
سه شنبه 12 مرداد 1389, 21:56 عصر
آیا همچین Data Type وجود دارد ؟

zoleikha
چهارشنبه 13 مرداد 1389, 17:04 عصر
میشه کد روش اول رو بنویسین؟(همون تبدیل13890513 به 1389/05/13)
فکر نمی کنین این روش توی select برای دیتاگرید به مشکل بربخوره؟