View Full Version : فیلتر بر اساس تاریخ
testapk
چهارشنبه 12 خرداد 1395, 19:07 عصر
سلام دوستان چطور میشه بین دو تا تاریخ جستجو کرد میشه کمکم کنید
Mahmood_M
چهارشنبه 12 خرداد 1395, 19:47 عصر
لطفا سئوالتون رو در بخش مناسب مطرح کنید
...
بستگی داره که تاریخ رو چطور ذخیره کرده باشید
بهتره با تاریخ میلادی کار کنید، می تونید یک فیلد تاریخ میلادی از نوع Date و یک فیلد تاریخ شمسی از نوع رشته داشته باشید و عملیات جستجو و محاسبات رو بر اساس تاریخ میلادی انجام بدید و فیلد تاریخ شمسی رو در خروجی نشون بدید
یا اینکه فقط یک فیلد میلادی داشته باشید و در زمان نمایش خروجی تاریخ رو به شمسی تبدیل کنید و به کاربر نمایش بدید
در صورت ذخیره تاریخ به صورت میلادی می تونید از عملگرهایی که برای اعداد استفاده می کنید، برای تاریخ هم استفاده کنید
در صورت استفاده از روشهایی مثل ذخیره جداگانه روز و ماه و سال فقط حجم بانک اطلاعاتی و حجم عملیات مورد نیاز زیاد میشه و هم سرعت اجرای عملیات در صورت بالا بودن تعداد رکورد ها کاهش پیدا خواهد کرد
ابتدا باید راه حل مناسبی برای ذخیره تاریخ پیدا کنید
تاریخ رو چطور ذخیره می کنید ؟
testapk
چهارشنبه 12 خرداد 1395, 20:03 عصر
من شمسی ذخیره کردم اینطوری
1395/03/17
ADOTable1.Insert;
ADOTable1.FieldByName('name').asstring:=maskedit1. Text;
ADOTable1.FieldByName('tel').asstring:=maskedit2.T ext;
ADOTable1.FieldByName('shoghl').asstring:=maskedit 6.Text;
ADOTable1.FieldByName('adreskar').asstring:=masked it4.Text;
ADOTable1.FieldByName('adreshome').asstring:=maske dit7.Text;
ADOTable1.FieldByName('dateozviyat').asstring:=mas kedit8.Text;
ADOTable1.FieldByName('vaziat').asstring:=maskedit 9.Text;
ADOTable1.FieldByName('madrak').asstring:=combobox 2.Text;
ADOTable1.FieldByName('age').asstring:=combobox3.T ext;
ADOTable1.FieldByName('kardbasij').asstring:=combo box4.Text;
ADOTable1.post;
میخوای برنامه بزارم من تازه شوع کردم زیاد وارد نیستم ببخشید
یوسف زالی
چهارشنبه 12 خرداد 1395, 20:44 عصر
سلام.
وقتی دارید where می گذارید از between استفاده کنید.
select * from TBL where MyDate between D1 and D2
فقط حواستون باشه که کوتیشن ها رو بگذارید.
Mahmood_M
چهارشنبه 12 خرداد 1395, 22:02 عصر
ذخیره تاریخ به صورت رشته کار درستی نیست
توی بحث رشته ها، هر کارکتر یک ارزش مشخصی داره، کارکتر اعداد هم ارزش گذاری میشن بر اساس مقدارشون، مثلا ارزش کارکتر '2' از کارکتر '1' بیشتره، وقتی تاریخ رو به صورت رشته ذخیره می کنید، مبنای مقایسه میشه ارزش کارکترها نه مقدار تاریخ
مثلا تاریخ "1395/01/09" با "1395/1/9" متفاوت میشه
یا مثلا تاریخ "1395/1/10" بزرگتر از "1395/01/16" در نظر گرفته میشه، در حالی که کوچکتره
علاوه بر این، برای مقایسه رشته ها، کارکتر به کارکتر بررسی میشه و سرعت به شدت پایین میاد
میخوای برنامه بزارم من تازه شوع کردم زیاد وارد نیستم ببخشید
الان بهترین موقع ست که این موارد رو رعایت کنید تا در آینده به مشکل بر نخورید
یک فیلد برای تاریخ میلادی از نوع Date درنظر بگیرید و یک فیلد برای تاریخ شمسی از نوع رشته
...
یک کامپوننت تاریخ شمسی در این تاپیک (http://barnamenevis.org/showthread.php?110628-%D9%83%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-%D8%AA%D9%82%D9%88%D9%8A%D9%85-%D8%B4%D9%85%D8%B3%DB%8C) قرار داده شده که هم تاریخ شمسی رو به صورت رشته خروجی میده و هم تاریخ میلادی معادلش رو به صورت رشته بهتون میده
برای جستجوی تاریخ، با استفاده از یک کامپوننت TSolarDatePicker ( که در لینک بالا هست ) مقدار تاریخ شمسی رو از کاربر بگیرید و بعد مقدار معادل میلادی اون رو در Filter استفاده کنید
MyTable.Filter := 'MDate >= ' + QuotedStr(SolarDatePicker1.ConvertDate) + ' AND ' + MDate <= ' + QuotedStr(SolarDatePicker2.ConvertDate);
MyTable.Filtered := True;
یا
MyTable.Filter := 'MDate BETWEEN ' + QuotedStr(SolarDatePicker1.ConvertDate) + ' AND ' + QuotedStr(SolarDatePicker2.ConvertDate);
MyTable.Filtered := True;
البته بسته به بانک اطلاعاتی که استفاده می کنید، ممکنه نیاز باشه فرمت رشته تاریخ ورودی رو تغییر بدید که می تونید از تابع FormatDateTime استفاده کنید :
QuotedStr(FormatDateTime('YYYY-MM-DD', StrToDate(SolarDatePicker1.ConvertDate)))
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.