PDA

View Full Version : سوال: فیلتر کردن جدول بر اساس تاریخ (فقط بر اساس ماه)



farzadkamali
جمعه 03 آبان 1392, 00:06 صبح
با سلام خدمت دوستان

من یه جدول دارم که فروش روزانه رو داخل خودش داره. به صورت زیر :

112190

تاریخ به صورت کامل ذخیره میشه(روز/ماه/سال)
می خوام گزارش ماهیانه(ماه جاری یا دلخواه) بگیرم. (ماه رو از یه ادیت میگیره). که باید جدول رو بر اساس ماه فیلتر کنم و گزارش بگیرم.
چه جوری میشه این کارو کرد. نمی خوام دو فیلد در جدول بگیرم که ماه و سال رو جدا ذخیره کنه.
راهی که به نظر خودم میرسه اینه که یه حلقه به تعداد کل رکوردها در نظر بگیرم و تاریخ رکورد رو تفکیک کنم و ماه رو با ماه دلخواهم بررسی کرده و برم رکورد بعدی... الی آخر. ولی فکر کنم احمقانه باشه نه؟

دستور زیر هم بر اساس کل تاریخ در نظر میگیره:


datamodule1.sales.filter:='date=solardatepicher1.t ext'


با دستور فیلتر یا query میشه انجام داد؟

ساده ترین راه حل چیه؟

یوسف زالی
جمعه 03 آبان 1392, 00:23 صبح
سلام. DBMS شما چیه؟ اکسس؟ یا اس کیو ال؟
تاریخ ها با چه فرمتی هستند؟ مثلا این طوری؟ 1392/08/03

farzadkamali
جمعه 03 آبان 1392, 08:30 صبح
سلام. DBMS شما چیه؟ اکسس؟ یا اس کیو ال؟
تاریخ ها با چه فرمتی هستند؟ مثلا این طوری؟ 1392/08/03

اس کیو ال هست. آره به همین شکل هست. 1392/08/03
البته فیلد تاریخ رو از نوع رشته (nvarchar) در نظر گرفتم.

SayeyeZohor
جمعه 03 آبان 1392, 10:15 صبح
اگه ديتابيستون اسكيوال هست فكر كنم اين كد كارتون رو راه بندازه :

ADOQuery1.Active := False;
ADOQuery1.SQL.Text := 'SELECT * FROM Sales Where SUBSTRING(Date, 6, 2) = ' + Copy(Trim(SolarDatepicker1.Text), 6, 2);
ADOQuery1.Active := True;

farzadkamali
جمعه 03 آبان 1392, 12:03 عصر
اگه ديتابيستون اسكيوال هست فكر كنم اين كد كارتون رو راه بندازه :

ADOQuery1.Active := False;
ADOQuery1.SQL.Text := 'SELECT * FROM Sales Where SUBSTRING(Date, 6, 2) = ' + Copy(Trim(SolarDatepicker1.Text), 6, 2);
ADOQuery1.Active := True;


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


Where SUBSTRING(Date, 6, 2) = ' + Copy(Trim(SolarDatepicker1.Text), 6, 2);

6 , 2 چیه؟ همینطور SUBSTRING .

SayeyeZohor
جمعه 03 آبان 1392, 12:25 عصر
خواهش ميكنم
دستورات ساده اي هستند
تابع SUBSTRING در اسكيوال سرور مانند تابع Copy در دلفي عمل ميكنه
هر دو تابع به اين صورت تفسير مي شند كه از رشته كه مورد نظرمون هست از index شروع (در اين مثال 6 يعني از حرق ششم شروع شود) به تعدادي كه مشخص مي كنيم (در اين مثال 2 يعني 2 حرف انتخاب شود) كه ازسمت چپ اين رشته (1392/02/02 حرف ششم مي شود 0 و دو حرف جدا شده 02 ميشود)

تنها روز :

ADOQuery1.SQL.Text := 'SELECT * FROM Sales Where SUBSTRING(Date, 9, 2) = ' + Copy(Trim(SolarDatepicker1.Text), 9, 2);


تنها ماه :

ADOQuery1.SQL.Text := 'SELECT * FROM Sales Where SUBSTRING(Date, 6, 2) = ' + Copy(Trim(SolarDatepicker1.Text), 6, 2);


تنها سال :

ADOQuery1.SQL.Text := 'SELECT * FROM Sales Where SUBSTRING(Date, 1, 4) = ' + Copy(Trim(SolarDatepicker1.Text), 1, 4);



ماه و سال :

ADOQuery1.SQL.Text := 'SELECT * FROM Sales Where (SUBSTRING(Date, 1, 4) = ' + Copy(Trim(SolarDatepicker1.Text), 1, 4) +') AND (SUBSTRING(Date, 6, 2) = ' + Copy(Trim(SolarDatepicker1.Text), 6, 2) +')';


دوست عزيز خدا اينترنت رو خلق كرد تا من و شما يك كم بگرديم
به اميد وب گردي بيشتر شما اميدوارم بدردتون بخوره :چشمک:

یوسف زالی
جمعه 03 آبان 1392, 14:33 عصر
خیلی خیلی واضحه.
واقعا امیدوارم سید جوابت رو نده.

SayeyeZohor
جمعه 03 آبان 1392, 14:58 عصر
نه دیگه نشد
آقا یوسف حق داره پسر گل یک کم فقط دقت میخواست واقعا متاسفم کردی
من کد رو واضح براتون نوشتم
کاری میکنین به حرف دوستان برسم و دیگه کمک نکنم
یک کم تلاش هم بد نیست


ماه و سال :

1
2
ADOQuery1.SQL.Text := 'SELECT * FROM Sales Where (SUBSTRING(Date, 1, 4) = ' + Copy(Trim(SolarDatepicker1.Text), 1, 4) +') AND (SUBSTRING(Date, 6, 2) = ' + Copy(Trim(SolarDatepicker1.Text), 6, 2) +')';

farzadkamali
جمعه 03 آبان 1392, 15:03 عصر
نه دیگه نشد
آقا یوسف حق داره پسر گل یک کم فقط دقت میخواست واقعا متاسفم کردی
من کد رو واضح براتون نوشتم
کاری میکنین به حرف دوستان برسم و دیگه کمک نکنم
یک کم تلاش هم بد نیست

آخ آخ آخ درسته.شرمنده. مبتدی هستیم دیگه چه میشه کرد. ظاهراً شما پست رو مجدد ویرایش کردید و من ندیدم. در هر حال ممنون بابت وقتی که گزاشتید.