1398-04-10 20:25 جستجو در دیتابیس بر اساس یک بازه زمانی
zahmah

 
سلام
من از تکنولوژی Data Entity Model و بانک SQL استفاده میکنم
یک تابع جستجو نوشته ام و در رویداد تغییر متن تکست باکس ها تابع رو صدا میزنم.
کد جستجویم به صورت زیر است:
private void  Searching()[/ltr]
{
var query = (from gets in Mydb.tbl_Get
where gets.Title.Contains(txtTitle.Text)
&& gets.Cat.Contains(cmbCategory.Text)
&& gets.SrcName.Contains(cmbSrc.Text)
&& gets.Pos.Contains(cmbPosition.Text)
&& string.Compare(gets.Date,calGetFrom.Text) >= 0
&& string.Compare(gets.Date, calGetTo.Text) <= 0
orderby gets.Date descending
select gets);

dataGridViewX1.DataSource = query.ToList();
}


مشکل کوئری در جستجوی بازه زمانی است
یعنی زمانی که دو خط مربوط به فیلتر بازه زمانی رو بر میدارم کد درست عمل میکنه
اما وقتی این دو خط کد هست هیج نتیجه ای نشون نمیده
منظورم این دو خط است:
&& string.Compare(gets.Date,calGetFrom.Text) >= 0
&& string.Compare(gets.Date, calGetTo.Text) <= 0


برای نمایش تاریخ هم از کنترلی به نام DateTimeSelector استفاده میکنم
ممنون میشم راهنمایی بفرمائین
1398-04-11 10:58
حاجی شریفی
مؤسس سایت
 
سلام
اول باید دو سوال بپرسم
الف) فیلد tbl_Get.Date در دیتابیس شما از چه نوعی تعریف شده است؟ متنی/string/varchar است یا تاریخی/date/datetime ؟

ب) آیا کنترلر DateTimeSelector شما خصیصه/فیلدی دارد که بجای متن/Text/string نوع تاریخی/DateTime برگرداند ؟
(مثلا DateTimeSelector.Value یا شاید DateTimeSelector.Date یا DateTimeSelector.SelectedDate دارد که نوعش System.DateTime باشد ؟)

--------------

فعلا نکته ای که میتوانم یادآوری کنم آن است که اگر فیلدهای شما متنی باشد ، مشکلاتی خواهید داشت، مثلا "2019-07-01" با "2019-07-1" با "2019-07-01 00:00:00" و یا "2019/07/01" فرق میکند و چهار هویت text/string ای جداگانه دارند و باید به این تفاوت های دقت کنید.

پیشنهاد میدهم اگر میتوانید در دیتابیس و برنامه برای تاریخ از نوع متن/text/string استفاده نکنید و حتما تاریخ را میلادی نگهداری و ذخیره کنید و از نوع استاندارد datetime استفاده کنید.
در نمایش میتوانید شمسی نمایش دهید و...

موفق باشید.
1398-04-11 18:22
zahmah

 
سلام
الف) فیلد tbl_Get.Date در دیتابیس از نوع nvarchar است
ب) کنترلر DateTimeSelector دو خصیصه در این رابطه دارد یکی Text که تاریخ شمسی را برمیگرداند و یکی هم خصیصه Value که فرموده بودین که تاریخ شمسی با ساعت را برمیگرداند(به نظر date است)

اگر از نوع date باشد به چه نحو در کوئری ام بکارگیری کنم؟
ممنون
1398-04-11 23:06
حاجی شریفی
مؤسس سایت
 
سلام

نقل قول نوشته شده توسط: zahmah
اگر از نوع date باشد به چه نحو در کوئری ام بکارگیری کنم؟

بله، پیشنهاد میکنم فیلد دیتابیس تان را بجای nvarchar به date/datetime تغییر دهید .
نوع datetime در SQL Server هم تاریخ و هم زمان/ساعت را ذخیره میکند ( روز فلان ساعت فلان )
نوع date در SQL Server فقط تاریخ بدون زمان/ساعت را ذخیره میکند

اگر ساعت و دقیقه و... ندارید بهتر است از date در SQL Server استفاده کنید.
اینطوری مقایسه و جستجو باز هم ساده تر میشود، دیگر نگران نابرابری ساعت نخواهید بود.
گمانم همان date کارتان را راه بیاندازد. بعید هم میدانم DateTimeSelector نمایش یا ویرایش ساعت ودقیقه هم داشته باشد.

سپس باید نوع tbl_Get.Date را در سی-شارپ از string به System.Datetime تغییر دهید

برای خواندن و نمایش اطلاعات از DateTimeSelector.Value استفاده کنید.
DateTimeSelector1.Value = row.Date ;


برای نوشتن و ذخیره اطلاعات هم همینطور ولی عکس رفتار کنید
row.Date = DateTimeSelector1.Value ;


حالا برای جستجو ومقایسه میتوانید به سادگی از اپراتور های == یا > و یا < و... استفاده کنید.

var  query = ( from  gets in  Mydb.tbl_Get 
where gets.Title.Contains(txtTitle.Text)
&& gets.Cat.Contains(cmbCategory.Text)
&& gets.SrcName.Contains(cmbSrc.Text)
&& gets.Pos.Contains(cmbPosition.Text)
&& gets.Date >= calGetFrom.Value
&& gets.Date <= calGetTo.Value
orderby gets.Date descending
select gets ).ToList() ;

یا فرم تابعی که مزیت هایی دارد
(در این روش میتوانید برخی فیلدها را برخی مواقع جستجوکنید و برخی موارد جستجو نکنید، در عمل خیلی به کار می آید)
var query = Mydb.tbl_Get.Where(gets =>
gets.Title.Contains(txtTitle.Text)
&& gets.Cat.Contains(cmbCategory.Text)
&& gets.SrcName.Contains(cmbSrc.Text)
&& gets.Pos.Contains(cmbPosition.Text)
&& gets.Date >= calGetFrom.Value
&& gets.Date <= calGetTo.Value)
.OrderByDescending(gets => gets.Date)
.ToList() ;


فقط کنترلر DateTimeSelector که انتخاب ساعت و دقیقه ندارد؟
چون اگر انتخاب ساعت ودقیقه هم دارد یک تغییر بسیار کوچک در دستورات فوق لازم است.

موفق باشید.
1398-04-13 16:09
zahmah

 
سلام
ستون date میلادی هم اضافه کردم مشکل حل شد.
ممنون بابت راهنمائی تون