PDA

View Full Version : جستجو براساس تاریخ



a1b2uu
شنبه 15 آبان 1389, 13:40 عصر
سلام دوستان
دیتابیس برنامم SqlServer 2008 و فیلد تاریخ رو با نوع Nvarchar ذخیره کردم.حالا وقتی جستجو بر اساس تاریخ میکنم درست کار نمیکنه ؟؟
برای مثال از 8/8/89 تا 10/8/89 رو سرچ میکنم رکورد رو نمیاره در صورتی که از 8/8/89 تا
9/8/89 رکورد ها رو میاره .اینم کدی که برای جستجو نوشتم

If Trim(DateTimePicker2.DateValue) <> ""And Trim(DateTimePicker4.DateValue) <> ""Then
If Str2 = ""Then
Str2 = " Where Datesale >= '" & Trim(DateTimePicker2.DateValue) & "' and Datesale <= '" & Trim(DateTimePicker4.DateValue) & "' "
Else
Str2 = Str2 & " And Datesale >='" & Trim(DateTimePicker2.DateValue) & "' and Datesale <='" & Trim(DateTimePicker4.DateValue) & "' "
EndIf
EndIf
برای ذخیره تاریخ تو برنامه هم ازDateTimePicker شمسی استفاده می کنم.

salehbagheri
شنبه 15 آبان 1389, 14:32 عصر
میتونم بپرسم با چه منطقی تصور کردید که یه رشته میتونه از رشته دیگری از لحاظ Value کوچکتر یا بزرگتر باشه؟

مقادیر رشته ای در SQl با NvarChar (و چندمورد دیگه) شناخته میشه! بنابراین نباید انتظار داشته باشید که همانند یک DateType برای شما عمل کنه ..

برای حل این مشکل کافیه تاریخ مورد نظر رو ابتدا به DateTime تبدیل سپس استفاده کنید.

با تشکر

ali_najari
شنبه 15 آبان 1389, 15:03 عصر
میتونم بپرسم با چه منطقی تصور کردید که یه رشته میتونه از رشته دیگری از لحاظ Value کوچکتر یا بزرگتر باشه؟

مقادیر رشته ای در SQl با NvarChar (و چندمورد دیگه) شناخته میشه! بنابراین نباید انتظار داشته باشید که همانند یک DateType برای شما عمل کنه ..

برای حل این مشکل کافیه تاریخ مورد نظر رو ابتدا به DateTime تبدیل سپس استفاده کنید.

با تشکر

دوست عزيز من دارم از همين متد (Char) استفاده ميكنم توي برنامه هام و بدون مشكل اينكارو ميكنم حتي بين 2 تاريخ نيز جستوجو ميكنم تا به حال هم مشكلي واسم پيش نيومده

Mani_rf
شنبه 15 آبان 1389, 15:22 عصر
دوست عزيز من دارم از همين متد (Char) استفاده ميكنم توي برنامه هام و بدون مشكل اينكارو ميكنم حتي بين 2 تاريخ نيز جستوجو ميكنم تا به حال هم مشكلي واسم پيش نيومده

این روش خیلی اصولی نیست. خودت که بهتر میدانی، برای مقایسه رشته، کاراکتر به کاراکتر به Ascii تبدیل و مقایسه میشه که احمال خطا برای مقایسه تاریخ در اون وجود داره. و روش اصولی تر استفاده از نوع تاریخ است.
اما اگر دقت کرده باشی این دوستمون تاریخ را به این صورت نوشته 8/8/89 تا 10/8/89 خب این که کاملا غلطه.

چرا؟
خیلی ساده
8/89
بزرگتر است یا
10/89؟

اگر از منطق انسانی استفاده کنیم، بله 10/89 بزرگتر است چون تاریخ است اما وقتی به کد اسکی تبدیل شود خیلی ساده است که 8 از 1 بزرگتر است بنابراین 8/89 از 10/89 بزرگتر است که کاملا اشتباه است.
اگر هم می خواهید از تاریخ به صورت رشته استفاده کنید، باید برای آن قالب کاملتری در نظر بگیرید. یعنی به این صورت تاریخ را ذخیره کنید: 08/08/1389 و 08/10/1389. حالا اگر مقایسه کنید مشکل بالا به وجود نمی آید و تاریخ ها درست مقایسه می شوند.

ali_najari
شنبه 15 آبان 1389, 15:30 عصر
بله mani جان من خودم هم از روش 10/08/1389 براي ذخيره سازي استفاده ميكنم

ميدونم اشتباه هست ولي خوب راهي وجود نداره براي ذخيره سازي تاريخ شمسي با قالب Date و مجبوريم از اين روش استفاده كنم

چرا يك روش وجود داره و اونم اينكه تاريخ رو بصورت ميلادي وارد كني و بعد تبديل كني كه اينطوري ميزان تبديل كردن ها زياد ميشه

Mani_rf
شنبه 15 آبان 1389, 15:44 عصر
چرا يك روش وجود داره و اونم اينكه تاريخ رو بصورت ميلادي وارد كني و بعد تبديل كني كه اينطوري ميزان تبديل كردن ها زياد ميشه

من از این روش استفادی میکنم ، مشکلی هم ندارم. دوتا تابع عمومی نوشتم، موقع فراخوانی تاریخ را به یکی از اونها میفرستم تا تبدیل بشه و نمایش داده بشه و موقع ذخیره هم به یک تابع دیگه فرستاده میشه تا به میلادی تبدیل بشه . مشکلی نداشتم . اما این مزیت را داره که تو همون فیلد علاوه بر تاریخ زمان را هم میتواند ذخیره کنید برای روز مبادا :لبخند:

a1b2uu
شنبه 15 آبان 1389, 16:00 عصر
اول تاریخ رو از نوع date ذخیره کردم ولی مشکل توی نمایش اونه که به این شکله
1389/08/08

b.mahsa
شنبه 15 آبان 1389, 19:20 عصر
من خودم هم از روش 10/08/1389 براي ذخيره سازي استفاده ميكنم

من هم از این روش استفاده میکنم . تا حالا به مشکلی بر نخوردم.


اما این مزیت را داره که تو همون فیلد علاوه بر تاریخ زمان را هم میتواند ذخیره کنید برای روز مبادا :لبخند:
مگه تو حالت string نمیشه time رو هم ذخیره کرد؟
البته من Time رو تو یه فیلد جدا میریزم .


اول تاریخ رو از نوع date ذخیره کردم ولی مشکل توی نمایش اونه که به این شکله
1389/08/08

این شکل مگه چه مشکلی داره؟ درستش همینه.

salehbagheri
دوشنبه 17 آبان 1389, 14:21 عصر
دوستان همیشه سعی کنید هر چیزی را در DataType مخصوص خودش استفاده کنید.

گرچه ممکنه امروز به مشکلی بر نخورید ولی روزی که خواستید تغییراتی در میلیونها فیلد تاریخ ایجاد کنید متوجه اشتباه بزرگتون میشوید ...

نظر شخصی من این هست که تاریخ شمسی رو هیچگاه در پایگاه داده ذخیره نکنید بلکه معادل اون رو در میلادی ذخیره کنید.

یا اگر خیلی اصرار بر ذخیره تاریخ شمسی در DB دارید روز و ماه و سال رو جداگانه در فیلد int ذخیره کنید.

با تشکر

s.k711
شنبه 24 اردیبهشت 1390, 12:50 عصر
دوستان همیشه سعی کنید هر چیزی را در DataType مخصوص خودش استفاده کنید.

گرچه ممکنه امروز به مشکلی بر نخورید ولی روزی که خواستید تغییراتی در میلیونها فیلد تاریخ ایجاد کنید متوجه اشتباه بزرگتون میشوید ...

نظر شخصی من این هست که تاریخ شمسی رو هیچگاه در پایگاه داده ذخیره نکنید بلکه معادل اون رو در میلادی ذخیره کنید.

یا اگر خیلی اصرار بر ذخیره تاریخ شمسی در DB دارید روز و ماه و سال رو جداگانه در فیلد int ذخیره کنید.

سلام دوست عزيز روش شما روش خوبي است اما اگه بخواهيم نتايج جستجو را تو ديتاگريد نمايش بديم چه جوري روز و ماه و سال را با هم ادغام كنيم كه به طور مثال به صورت :5/3/1389 نمايش بده:متفکر: