PDA

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



sara_csharp
دوشنبه 02 بهمن 1391, 21:37 عصر
سلام
وقتی تاریخ را با date در sql ذخیره میکنیم و می خواییم جستجو کنیم کنارش زمان رو هم میاره چیکار باید بکنیم تا زمان رو نیاره ؟

RED-C0DE
دوشنبه 02 بهمن 1391, 22:17 عصر
یک راه اینه:
SELECT CONVERT(date,GETDATE())

Y_Safaiee
دوشنبه 02 بهمن 1391, 22:33 عصر
سلام
وقتی تاریخ را با date در sql ذخیره میکنیم و می خواییم جستجو کنیم کنارش زمان رو هم میاره چیکار باید بکنیم تا زمان رو نیاره ؟

سلام دوست من

کدی که دوستمون گفتن درسته اما من بهتون توصیه میکنم اگه برنامتون فارسی زبانه و تاریخ شمسی استفاده میکنین(که بایدم اینطور باشه) از نوع Date استفاده نکنین چون این نوع فرمت برای تاریخ های میلادیه و تاریخ شمسی داخلش بی اعتباره,مثلا روزهای 31 روزه رو (مثه تیر,مرداد,شهریور) داخل خودش ذخیره نمیکنه و عملا اشتباس.

بهترین نوع برای ذخیره تاریخ Nvarchar هست که به راحتیم قابلیت جستجو یا جستجو براساس تاریخ تا تاریخ است.

موفق باشین
بایت بایت

ordebehesht
سه شنبه 03 بهمن 1391, 00:51 صبح
احتمالا تو دیتابیس نوع داده رو از نوع datatime گرفتی تنها از data بگیر و تو c# تبدیل به تاریخ کن

ولی nvarchar بنا به گفته دوستمون پیشنهاد میشه

shahab2025
سه شنبه 03 بهمن 1391, 08:46 صبح
با سلام


بهترین نوع برای ذخیره تاریخ Nvarchar هست که به راحتیم قابلیت جستجو یا جستجو براساس تاریخ تا تاریخ است.




ولی nvarchar بنا به گفته دوستمون پیشنهاد میشه


میشه توضیح بدین چرا Nvarchar ؟
وچرا Varchar نه ؟ مگه برای sql فرقی میکنه عدد فارسی باشه یا لاتین؟
و یا چرا اصلا Char(10) استفاده نمیشه ؟ خوب معلومه دقیقاً طول فیلد چقدره.....

ordebehesht
سه شنبه 03 بهمن 1391, 12:00 عصر
برای اینکه N اجازه ورد اطلاعات فارسی رو میده تا به شکل صحیح تو دیتا بیس ذخیره بشه

ordebehesht
سه شنبه 03 بهمن 1391, 12:02 عصر
اما در مورد char‌اگه فرضا char(15) بگیری و داده ای به طول 10 وارد کنی 5 تا خونه خالی جز فضای هدر رفته بحساب میاد اما اگه varchar بگیری خانه های مورد ایستفاده هرچند به طور پیش فرض مقدار دادی اما با توجه به طول دادت خونه اشغال میکنه تو مثال 10 خونه و دیگه فضای خالی و هدر رفته نحواهیم داشت

shahab2025
سه شنبه 03 بهمن 1391, 12:13 عصر
برای اینکه N اجازه ورد اطلاعات فارسی رو میده تا به شکل صحیح تو دیتا بیس ذخیره بشه

یعنی عقیده دارید برای sql فرق میکنه من عدد 1 را فارسی بنویسم یا لاتین ؟؟؟؟ من که فکر نمی کنم



اما در مورد char‌اگه فرضا char(15) بگیری و داده ای به طول 10 وارد کنی 5 تا خونه خالی جز فضای هدر رفته بحساب میاد اما اگه varchar بگیری خانه های مورد ایستفاده هرچند به طور پیش فرض مقدار دادی اما با توجه به طول دادت خونه اشغال میکنه تو مثال 10 خونه و دیگه فضای خالی و هدر رفته نحواهیم داشت

من که توضیح دادم چون تاریخ همیشه 10 رقمی است پس نیازی نیست من طول فیلد را 15 رقمی بگیرم

لطفا دلیلی بیارید که برای این موضوع منطقی باشه - وگرنه توضیحات مربوط به انواع داده را همه بلد هستند
مرسی

RED-C0DE
سه شنبه 03 بهمن 1391, 12:29 عصر
با سلام
میشه توضیح بدین چرا Nvarchar ؟
وچرا Varchar نه ؟ مگه برای sql فرقی میکنه عدد فارسی باشه یا لاتین؟
و یا چرا اصلا Char(10) استفاده نمیشه ؟ خوب معلومه دقیقاً طول فیلد چقدره.....


برای اینکه N اجازه ورد اطلاعات فارسی رو میده تا به شکل صحیح تو دیتا بیس ذخیره بشه

البته اگه سیاست کاری بر این باشه ک نوع تاریخ رو بصورت رشته در بانک ذخیره کنید varchar هم جوابگو هست چون فقط با عدد و شاید هم با / سر و کار داریم
1391/10/25 یا 13911025 یا 1391-10-25 ،...
اینجا دیگه خبری از حروف نیست ک بخوایم از انواع یونیکد ک با N شروع می شن و 2برابر فضا اشغال می کنن استفاده کنیم..

و حتی بهتره (مثلا در اینجا) از نوع char(10) (حالا یا nullable یا notNullable) استفاده ش. ک هزینه ی نگهداری یک نوع با طول متغیر (مثل Varchar) رو نداشته باشیم. همونطور ک می دونید همین مکانیزمی ک برای نگهداشتن طول واقعی یک نوع با اندازه متغیر مثل Varchar استفاده می شه هم باید ب نحوی محاسبه بشه ک در اینجا نیازی ب این هم نیست و یک متغیر با طول ثابت از جنس کرکتر هم کار رو راه می اندازه
char(10)

--
البته توصیه شده و می شه (با توجه ب مزایای محاسباتی و دقت کار) از نوع خود DateTime در sql و سمت برنامه برای کار با تاریخ خورشیدی استفاده کنیم. این وسط ، با تغییر Culture‌ برنامه ، ما در برنامه عملا هیچ کاری انجام نمی دیم و داریم خیلی عادی با تاریخ و نوع DateTime دات نت کار می کنیم ولی چون Culture جاری برنامه رو تغییر دادیم چیزی ک می بینیم تاریخ خورشیدی هست نه میلادی.
و در سمت بانک هم خیلی جاها حتی نیازی ب تبدیل تاریخ از میلادی ب خورشیدی و بالعکس نمی باشد . (رو این قضیه اگه خواستین ، بگردین همین فروم هم زیاد بحث شده روش)

Y_Safaiee
سه شنبه 03 بهمن 1391, 14:19 عصر
یعنی عقیده دارید برای sql فرق میکنه من عدد 1 را فارسی بنویسم یا لاتین ؟؟؟؟ من که فکر نمی کنم


من که توضیح دادم چون تاریخ همیشه 10 رقمی است پس نیازی نیست من طول فیلد را 15 رقمی بگیرم

لطفا دلیلی بیارید که برای این موضوع منطقی باشه - وگرنه توضیحات مربوط به انواع داده را همه بلد هستند
مرسی

سلام دوست خوبم
1.Datetime رو که معایبشو گفتم و همونطور که دوستان گفتن میشه با تغییر Culture مشکلاتشو رفع کرد که برای افراد مبتدی سخته و غیر از اون به صرفه نیست.

2.کی گفته همیشه همه تاریخ استاندارد رو وارد میکنن؟!!مثلا خود شما وقتی روی برگه تاریخ تولدتونو مینویسین یا ادارات چطوری مینویسین؟!معمولا اینطوری مینویسن 67/9/16 یا 1367/9/16 پس همیشه کل اعداد تکمیل نمیشن پس Char(10) رو کلا بیخیال شین اگه طرف کمتر از تاریخ استاندارد وارد کنه فضا هدر میره و بدیشم اینه که تو سرچ شمام باید جای فضای خالی اسپیس بزنین.

2.varchar هم گزینه ی خوبیه برای تاریه چون فضای کمتری اشغال میکنه اما تو جستجو اذیت میشین و با بعضی از collection های Sql server درج / جستجوی شما با مشکل روبرو میشه.

3.nvarchar اونم نیازی نیست پیش فرض 50 باشه میتونه nvarchar(10) باشه,غیر از اینکه مشکلی با Collection نداره و به صورت Unicode اطلاعات رو ذخیره میکنه,قابل تغییر سایز هم هست یعنی طرف کمتر ( 67/9/16 یا 1367/9/16) وارد کنه فضای خالی نمیخوره.

در کل بعضی وقت ها تاریخ هام استاندارد وارد نمیشن مثلا تو بعضی سازمان ها تاریخ تولد شخص به صورت د16 م9 س 67 ثبت میشه پس پیشگیری بهتر از درمانه.

من که همیشه بنا بر نوع پروژم Nvarchar(10) یا Nvarchar(15) معرفی میکنم و تا الان که نزدیک 300-400 تا برنامه نوشتم با مشکلی بر نخوردم.

اگه قراره Sql server با 2بایت فضای بیشتر گرفتن سرعتش کم شه هم منسوخ شه بهتره.

در پایان

صلاح مملکت خویش خسروان دانند.

موفق باشین
بایت بایت

shahab2025
سه شنبه 03 بهمن 1391, 14:46 عصر
سلام
مرسی از اینکه در بحث شرکت کردین


2.کی گفته همیشه همه تاریخ استاندارد رو وارد میکنن؟!!مثلا خود شما وقتی روی برگه تاریخ تولدتونو مینویسین یا ادارات چطوری مینویسین؟!معمولا اینطوری مینویسن 67/9/16 یا 1367/9/16 پس همیشه کل اعداد تکمیل نمیشن پس Char(10) رو کلا بیخیال شین اگه طرف کمتر از تاریخ استاندارد وارد کنه فضا هدر میره و بدیشم اینه که تو سرچ شمام باید جای فضای خالی اسپیس بزنین.

ببینم کی گفته من باید به کاربر اجازه بدم هر چی دلش خواست توی دیتابیس بزنه ؟
خود شما برای نمونه اگه کاربر برنامه هات تاریخ را به صورتهای فوق وارد کنند همانطوری ذخیره میکنی و همانطوری هم موقع گزارشات به کاربر پس میدی ؟؟؟؟ اگه خواستی یه کاری روی تاریخ کنی چی ؟ برای هر نمونه یه کد مینویسی؟
من عقیده دارم تاریخ باید به صورت 00-00-0000 ذخیره بشه پس واسه دیتا بیسم یه کلاس کنترلی یا یه تریگر میزارم تا کاربر موقع کار با دیتا گرید فکر نکنه برنامه ام از اکسل هم کمتره.



در کل بعضی وقت ها تاریخ هام استاندارد وارد نمیشن مثلا تو بعضی سازمان ها تاریخ تولد شخص به صورت د16 م9 س 67 ثبت میشه پس پیشگیری بهتر از درمانه.


به نظر من این نوع ورود اطلاعات هم نیاز به nvarchar نداره منطقش باید اصلاح بشه


بعید میدونم شما با این 300 - 400 برنامه ای که خروجی دادین جزو مبتدیان حساب بشین .
پس لطفا مسیر بحث را عوض نکنید

شما را نمی دونم ولی برنامه نویسهای متفاوتی را دیدم که نه به خاطر حافظه و غیره بلکه به خاطر تنبلی یا عدم مطالعه دقیق فقط 4 تا فیلد یاد گرفتن و اونا رو هی استفاده میکنن. اگه دیتابیس اونا رو ببینی توی هر جدولشون برای همه نوع کاری nvarchar دارن. و خیلی راحت میگن این بهتره ....



صلاح مملکت خویش خسروان دانند.

من هم با این موافقم
ولی عقیده دارم کار باید طوری باشه که اگه پس فردا یکی مرورش کرد فکرای بدی در موردم نکنه

و در انتها
اگر صریح حرف زدم قصد بی احترامی و بی ادبی نداشتم
خوشحال میشم باز هم نظرات شما را داشته باشم