PDA

View Full Version : جستجو و نمایش تاریخ هایی از database که مابین دو تاریخ اند



سمیرا55
پنج شنبه 14 شهریور 1392, 22:30 عصر
سلام
میخام ازبین سطرهای جدول ام که در دیتابیس ذخیره شده سطرهایی رو select کنم که فیلد date اون ها بین دو تا تاریخ باشه
در واقه داخل page ام دو تا تاریخ شروع و پایان دارم که کاربر از dropdowmlist انتخاب میکنه از طرفی داخل جدول databasam هم فیلدی به نام date دارم حالا مثلا کاربر تاریخ شروع و پایان رو از داخل dropdownlist انتخاب میکنه حالا میخام اون سطرهایی از جدول داخل gridview نمایش داده بشه که فیلد date اون ها در محدوده تاریخ شروع و پایان باشه چطور میشه این کار رو انجام بدم
از دستور between استفاده کردم ولی در بعضی مواقع جواب میده فقط
نوع فیلد date رو nvarchar گرفتم این هم کدم

string a = DropDownList7.Text + DropDownList8.Text + DropDownList9.Text;

string b = DropDownList10.Text + DropDownList3.Text + DropDownList6.Text;
string commandtext = "select * from sentmassage where date BETWEEN '" + a + "' and '" + b + "'

nice_boy_a
پنج شنبه 14 شهریور 1392, 22:52 عصر
سلام.
کلا سوالات تو فازه تاریخه! نمیدونم چه مشکلی داری با تاریخ! :لبخند:
شما دستور SQL رو اینجوری تغییر بده که کوچکتر از فلان تاریخ و بزرگتر از فلان تاریخ باشه
select * from sentmassage where date > filed1 and date < fiel2

سمیرا55
جمعه 15 شهریور 1392, 00:08 صبح
آخه نوع داده جدولم از نوع string هس با between میشه همچنین کاری رو انجام بدم؟

General-Xenon
جمعه 15 شهریور 1392, 04:58 صبح
آخه نوع داده جدولم از نوع string هس با between میشه همچنین کاری رو انجام بدم؟

سلام . معمولا برای تاریخ باید از نوع Date یا Datetime استفاده کنی اما حالا موردی نداره
بیا موقع Select کردن فیلدت رو تبدیل کن فرمت ذخیره چیه ؟ 10-05-1391 ؟ 1391/05/10 ؟

مثال برات میزنم اگر فرمت ذخیره این بود موقع Select باید اینجوری بنویسی(احتمالا شمسی تاریخ وارد کردی پس مقادیر مثال به تاریخ شمسی هست فرمت ذخیره مثال : YYYY/MM/DD) :


-- --------------------------------------------------------------------------------------- --
-- Chon man Jadvaleto nemidonam Chie bara khodam 1 jadval Dorost kardam be name -- MyTable --
-- --------------------------------------------------------------------------------------- --
DECLARE @MyTable Table (cid int,date nvarchar(50));
insert into @MyTable(cid,date) values (1,'1391/05/06');
insert into @MyTable(cid,date) values (2,'1391/05/01');
insert into @MyTable(cid,date) values (3,'1391/05/02');
insert into @MyTable(cid,date) values (4,'1391/05/21');
insert into @MyTable(cid,date) values (5,'1391/05/07');
insert into @MyTable(cid,date) values (6,'1391/05/15');

-- Tarikhe Voroodie aval 1391/05/03
-- Tarikhe Voroodie Dovom 1391/05/15
Select * from @MyTable
WHERE CONVERT(bigint,replace(date,'/','')) >= CONVERT(bigint,replace('1391/05/03','/','')) AND
CONVERT(bigint,replace(date,'/','')) <= CONVERT(bigint,replace('1391/05/15','/',''));

سمیرا55
جمعه 15 شهریور 1392, 09:12 صبح
این کدتون با c# نیست

من یک راه دیگه استفاده کردم ببینید من فیلد تاریخ در database رو از نوع date گرفتم و چندتا تاریخ میلادی هم وارد کردم این کدم رو ببینید
string a = DropDownList7.Text + "/" + DropDownList8.Text + "/" + DropDownList9.Text;

string b = DropDownList10.Text + "/" + DropDownList3.Text + "/" + DropDownList6.Text;
DateTime a1 = Convert.ToDateTime(a.ToString());
DateTime b1 = Convert.ToDateTime(b.ToString());

SqlConnection co = new SqlConnection("Data Source=.;Initial Catalog=sms_website;Integrated Security=True");
string commandtext = "select * from tabel1 where date BETWEEN '" + a1.ToString() + "' and '" + b1.ToString()+ "'";

SqlCommand cmd = new SqlCommand(commandtext, co);
co.Open();

SqlDataReader dr = cmd.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();

co.Close();


حالا متغیرهای a1 و b1 به صورت date اند اما میلادی نیستند حالا چطور به میلادی تبدیلشون کنم تابع تبدیل تاریخ شمسی به میلادی رو دارم ولی بازگشتیه میخام تاریخ میلادی داخل یک متغیری ریخته بشه که بتونم داخل دستور select ام ازش استفاده کنم . راه حل ام به طور کلی درسته؟

General-Xenon
جمعه 15 شهریور 1392, 12:23 عصر
این کدتون با C#‎ نیست

من یک راه دیگه استفاده کردم ببینید من فیلد تاریخ در database رو از نوع date گرفتم و چندتا تاریخ میلادی هم وارد کردم این کدم رو ببینید


حالا متغیرهای a1 و b1 به صورت date اند اما میلادی نیستند حالا چطور به میلادی تبدیلشون کنم تابع تبدیل تاریخ شمسی به میلادی رو دارم ولی بازگشتیه میخام تاریخ میلادی داخل یک متغیری ریخته بشه که بتونم داخل دستور select ام ازش استفاده کنم . راه حل ام به طور کلی درسته؟

ببین دوست من دستور BETWEEN در تاریخ ها خوب عمل نمیکنه . من تست کردم تاریخ رو بر اساس روز مقایسه می کنه ... برای اینکه بتونی استفاده کنی باید مقدار رو تبدیل به یک عدد کنی و در هون SQL بررسی کنی .. این کد بالا کلا SQL هست . ربطی به C#‎ نداره ، یعنی شما چکیده و بهینه نتیجه SELECTت رو می بینی ... راه دیگه بررسی در محیط C#‎ هست که خوب راه بهینه ای نیست . مثلا باید کل رکورد ها رو بیاری و بعد یکی یکی بررسی کنی تا مقدار مورد نظرت رو دریافت کنی ... این مثالی که برات زدم رو دقت کن.....

خوبه ، حالا فیلد بانکت Date هست ...

این کلاس تبدیل تاریخ شمسی به میلادی

فرمت ورودی : 1391/05/26 به این صورت باید وارد کنی
public static DateTime ConvertPersToGregDate(string str = "")
{
DateTime _ret = DateTime.Now;
if (System.Text.RegularExpressions.Regex.IsMatch(str, "[0-9]{4}/[0-9]{2}/[0-9]{2}"))
{
try
{
DateTime dt = new DateTime(Convert.ToInt32(str.Split('/')[0]),
Convert.ToInt32(str.Split('/')[1]), Convert.ToInt32(str.Split('/')[2]));
System.Globalization.GregorianCalendar gc = new System.Globalization.GregorianCalendar();
_ret = new DateTime(gc.GetYear(dt), gc.GetMonth(dt), gc.GetDayOfMonth(dt),
new System.Globalization.PersianCalendar());
}
catch { _ret = DateTime.Now; }
}
return _ret;
}

و اما کلاس خودت :

string a = DropDownList7.Text + "/" + DropDownList8.Text + "/" + DropDownList9.Text;
string b = DropDownList10.Text + "/" + DropDownList3.Text + "/" + DropDownList6.Text;

DateTime a1 = ConvertPersToGregDate(a.ToString()); // beSharti ke Voroodi 1391/05/02 bashe ha... !!! Deghat kon > yyyy/MM/dd
DateTime b1 = ConvertPersToGregDate(b.ToString()); // beSharti ke Voroodi 1391/05/02 bashe ha... !!! Deghat kon > yyyy/MM/dd

SqlConnection co = new SqlConnection("Data Source=.;Initial Catalog=sms_website;Integrated Security=True");
string commandtext = "Select * from [TableName]
WHERE CONVERT(bigint,replace(convert(nvarchar,[DateColumn]),'-','')) >= CONVERT(bigint,@d1) AND
CONVERT(bigint,replace(convert(nvarchar,[DateColumn]),'-','')) <= CONVERT(bigint,@d2);";

SqlCommand cmd = new SqlCommand(commandtext, co);
cmd.Parameters.addWithValue("@d1",a1.ToString("yyyyMMdd"))
cmd.Parameters.addWithValue("@d2",a2.ToString("yyyyMMdd"))
co.Open();

SqlDataReader dr = cmd.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();

co.Close();

mahdioo12194
جمعه 15 شهریور 1392, 12:32 عصر
Select * from @MyTable
WHERE CONVERT(bigint,replace(date,'/','')) >= CONVERT(bigint,replace('1391/05/03','/','')) AND
CONVERT(bigint,replace(date,'/','')) <= CONVERT(bigint,replace('1391/05/15','/',''));



یکی کامل اینو توضیح میده؟!

General-Xenon
جمعه 15 شهریور 1392, 12:47 عصر
Select * from @MyTable
WHERE CONVERT(bigint,replace(date,'/','')) >= CONVERT(bigint,replace('1391/05/03','/','')) AND
CONVERT(bigint,replace(date,'/','')) <= CONVERT(bigint,replace('1391/05/15','/',''));



یکی کامل اینو توضیح میده؟!

ببین دوست یک Select ساده هست . فقط چون SQL مابین دو تاریخ رو تشخیص نمیده ما از راه دیگه ای وارد میشیم . همه مقادیر رو تبدیل به یک عدد میکنیم
مثال :(date)1391/10/25 => 13911025<(bigint)
(date)2008/05/01 => 20080501<(bigint)
حالا Select رو بر اساس این قاعده می نویسیم .... پله به پله :
تیکه اول که خب همه بلدند
Select * from @MyTable
تیکه دوم :
1) date -- Esme Fildemon ke typesh Date hastesh
2) convert(nvarchar,date) -- Tabdile oon Date be yek Reshte baraye barresi
3) replace(convert(nvarchar,dateColumn),'-','') -- tarikhi ke tabdilesh kardi to ghesmate 2 injori mishe 2013-08-05, hala miay in '-' ro barmidari ke faghat adad bemone
4) CONVERT(bigint,replace(convert(nvarchar,dateColumn ),'-','')) -- bad az bardashtane alaem baz hanoz String Hast . pas tabdil mikoni be Adad ke betoni begi kochik tar bashe ya bozorgtar az ye chizi

.) --hala amadas ke begi meghdare filde date chi beshe ?????
5) CONVERT(bigint,replace(convert(nvarchar,dateColumn ),'-','')) > (bozorgtar az chi ? taikhe aval)
5) CONVERT(bigint,replace(convert(nvarchar,dateColumn ),'-','')) > (tarikheto dobare tabdil kon)
5) CONVERT(bigint,replace(convert(nvarchar,dateColumn ),'-','')) > CONVERT(bigint,'20130809') -- tarikh '2013-08-09'in boode man dige mostaghim ino gozashtam . replace ghesmate aval ro nazashtam

.) sharte 2 monde hanooz
6)CONVERT(bigint,replace(convert(nvarchar,dateColu mn),'-','')) > CONVERT(bigint,'20130809') AND
CONVERT(bigint,replace(convert(nvarchar,dateColumn ),'-','')) < CONVERT(bigint,'20130815')

-- alan chi shode ? tarikhe beyne rooze 9 mahe 8 ta rooze 15 mahe 8 ro barat miare . vali ba tabdil be bigint

سمیرا55
شنبه 16 شهریور 1392, 11:30 صبح
این کدی که دادید رو استفاده کردم ولی این قسمت رو نمیشناسه و error میده
ConvertPersToGregDate

General-Xenon
شنبه 16 شهریور 1392, 13:30 عصر
این کدی که دادید رو استفاده کردم ولی این قسمت رو نمیشناسه و error میده
ConvertPersToGregDate

یکم دقت بفرمایید ... من کد این تابعی که Error داده رو براتون گذاشتم دیگه ....

public static DateTime ConvertPersToGregDate(string str = "")
{
DateTime _ret = DateTime.Now;
if (System.Text.RegularExpressions.Regex.IsMatch(str, "[0-9]{4}/[0-9]{2}/[0-9]{2}"))
{
try
{
DateTime dt = new DateTime(Convert.ToInt32(str.Split('/')[0]),
Convert.ToInt32(str.Split('/')[1]), Convert.ToInt32(str.Split('/')[2]));
System.Globalization.GregorianCalendar gc = new System.Globalization.GregorianCalendar();
_ret = new DateTime(gc.GetYear(dt), gc.GetMonth(dt), gc.GetDayOfMonth(dt),
new System.Globalization.PersianCalendar());
}
catch { _ret = DateTime.Now; }
}
return _ret;
}

سمیرا55
شنبه 16 شهریور 1392, 15:48 عصر
با تشکر از شما ولی رو این کدهای شما خیلی کار کردم ولی error میده الان من فیلد تاریخ رو داخل database از نوع date گرفته بودم میخاستم ببینم این کدها با این چه شرطی کار میکنه؟ این که تاریخ های ذخیره شده در database از نوع میلادی ذخیره کنم یا شمسی؟
از طرفی من تاریخ شروع و پایان از dropdownlist رو با این فرمت انتخاب میکنم مثلا 1392/06/20 یعنی تاریخ شروع و پایانی که کاربر از dropdownlist انتخاب میکنه به این صورته
بعد من یک قسمت از کدتون رو متوجه نمیشم اون قسمتی که فرمت رو این طوری گفتید
cmd.Parameters.addWithValue("@d1",a1.ToString("yyy yMMdd"))
cmd.Parameters.addWithValue("@d2",a2.ToString("yyy yMMdd"))
من فرمت رو این طوری گذاشتم با space بین روز و ماه سال yyyy mm dd
قبلش error میداد در تبدیل nvarchar و bigint ولی وقتی فرمتش رو yyyy mm dd
تغییر دادم بهم خروجی داد ولی بعضی از تاریخ ها رو درست برام انتخاب نمیکنه

General-Xenon
شنبه 16 شهریور 1392, 17:15 عصر
با تشکر از شما ولی رو این کدهای شما خیلی کار کردم ولی error میده الان من فیلد تاریخ رو داخل database از نوع date گرفته بودم میخاستم ببینم این کدها با این چه شرطی کار میکنه؟ این که تاریخ های ذخیره شده در database از نوع میلادی ذخیره کنم یا شمسی؟
از طرفی من تاریخ شروع و پایان از dropdownlist رو با این فرمت انتخاب میکنم مثلا 1392/06/20 یعنی تاریخ شروع و پایانی که کاربر از dropdownlist انتخاب میکنه به این صورته
بعد من یک قسمت از کدتون رو متوجه نمیشم اون قسمتی که فرمت رو این طوری گفتید
cmd.Parameters.addWithValue("@d1",a1.ToString("yyy yMMdd"))
cmd.Parameters.addWithValue("@d2",a2.ToString("yyy yMMdd"))
من فرمت رو این طوری گذاشتم با space بین روز و ماه سال yyyy mm dd
قبلش error میداد در تبدیل nvarchar و bigint ولی وقتی فرمتش رو yyyy mm dd
تغییر دادم بهم خروجی داد ولی بعضی از تاریخ ها رو درست برام انتخاب نمیکنه

ببینید اگر دیتای شما از نوع Date باشه شما مقدار های ورودیت میشه : 10-10-1391 اما ون تبدیل تاریخ از شمسی به میلادی امکان پذیر نیست شما باید با استفاده از تابعی که دادم به شما استفاده کنی . مقادیر رو با فرمت yyyyMMdd انتقال بدین ... الان شما yyyymmdd ارسال کردین .... mm = دقیقه
MM = ماه
yyyy = سال 4 رقمی > 2013
dd = روز.

space نباید بگذارید چون مثال : 10 10 1391 رو نمی تونه تبدیل به عدد کنه...حتی شما باید حتالامکان کاراکتر های اضافی رو پاک کنید تا عملیات به درستی انجام شه...
به مثال دقت کن ...
DropDown ها اطلاعات رو پاس میدن به چی ؟ تابع .. اون تابع تبدیل به میلادی رو انجام خواهد داد . در این صورت دیگه هیچوقت مشکل تبدیل رو نخواهید داشت .

سمیرا55
شنبه 16 شهریور 1392, 18:47 عصر
الان من دقیقا این تابع رو گذاشتم
protected void Button1_Click(object sender, EventArgs e)
{
string a = DropDownList7.Text + "/" + DropDownList8.Text + "/" + DropDownList9.Text;
string b = DropDownList10.Text + "/" + DropDownList3.Text + "/" + DropDownList6.Text;



DateTime a1 = ConvertPersToGregDate(a.ToString()); // beSharti ke Voroodi 1391/05/02 bashe ha... !!! Deghat kon > yyyy/MM/dd
DateTime b1 = ConvertPersToGregDate(b.ToString()); // beSharti ke Voroodi 1391/05/02 bashe ha... !!! Deghat kon > yyyy/MM/dd

SqlConnection co = new SqlConnection("Data Source=.;Initial Catalog=sms_website;Integrated Security=True");
string commandtext = "Select * from sentmassage WHERE CONVERT(bigint,replace(convert(nvarchar,date),'-','')) >= CONVERT(bigint,@d1) AND CONVERT(bigint,replace(convert(nvarchar,[date]),'-','')) <= CONVERT(bigint,@d2);";


SqlCommand cmd = new SqlCommand(commandtext, co);
cmd.Parameters.AddWithValue("@d1", a1.ToString("yyyyMMdd"));
cmd.Parameters.AddWithValue("@d2", b1.ToString("yyyyMMdd"));
co.Open();

SqlDataReader dr = cmd.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();

co.Close();
}
}

الان دقیقا این کدمه و تاریخ هایی که در دیتابیس وارد کردم شمسیه و از نوع date به صورت 4-05-1392 و space رو هم پاک کردم ولی باز هم درست کار نمیکنه مشکلش چیه؟

General-Xenon
یک شنبه 17 شهریور 1392, 08:12 صبح
الان من دقیقا این تابع رو گذاشتم
protected void Button1_Click(object sender, EventArgs e)
{
string a = DropDownList7.Text + "/" + DropDownList8.Text + "/" + DropDownList9.Text;
string b = DropDownList10.Text + "/" + DropDownList3.Text + "/" + DropDownList6.Text;



DateTime a1 = ConvertPersToGregDate(a.ToString()); // beSharti ke Voroodi 1391/05/02 bashe ha... !!! Deghat kon > yyyy/MM/dd
DateTime b1 = ConvertPersToGregDate(b.ToString()); // beSharti ke Voroodi 1391/05/02 bashe ha... !!! Deghat kon > yyyy/MM/dd

SqlConnection co = new SqlConnection("Data Source=.;Initial Catalog=sms_website;Integrated Security=True");
string commandtext = "Select * from sentmassage WHERE CONVERT(bigint,replace(convert(nvarchar,date),'-','')) >= CONVERT(bigint,@d1) AND CONVERT(bigint,replace(convert(nvarchar,[date]),'-','')) <= CONVERT(bigint,@d2);";


SqlCommand cmd = new SqlCommand(commandtext, co);
cmd.Parameters.AddWithValue("@d1", a1.ToString("yyyyMMdd"));
cmd.Parameters.AddWithValue("@d2", b1.ToString("yyyyMMdd"));
co.Open();

SqlDataReader dr = cmd.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();

co.Close();
}
}

الان دقیقا این کدمه و تاریخ هایی که در دیتابیس وارد کردم شمسیه و از نوع date به صورت 4-05-1392 و space رو هم پاک کردم ولی باز هم درست کار نمیکنه مشکلش چیه؟

string a = DropDownList7.Text + "/" + DropDownList8.Text + "/" + DropDownList9.Text;
مقدار اینو بررسی کن . فکر کنم فرمتی که تاریخ فارسی و میگیری 10 کاراکتر باید باشه .
مثلا عدد 9 ماه رو باید 09 بنویسی... ببین درسته ؟