PDA

View Full Version : مشکل در مقایسه تاریخ در جدول



boysilent
پنج شنبه 27 مهر 1391, 16:17 عصر
سلام دوستان من در پایگاه داده تاریخی بدین شکل ثبت کرده ام
1391/10/10

وداخل تکست باکسی که دارم تاریخ به شکل 1391/10/05 است میخواستم بدونم چطوری میشه این تاریخ رو با تاریخ داخل جدول مقایسه کرد و بگم درصورتی که 5 رور کوچکتر بود داخل گریدویو نشون بده
دوستان من با تفریق این 5 روز رو بدست میاورم اما مشکل اینه که تاریخ به این شکل ثبت میشه1391/10/10
و "/ "نمیزاره تفریق انجام بشه ؟؟؟به نظرتون چیکار میشه کرد؟؟؟

boysilent
پنج شنبه 27 مهر 1391, 16:47 عصر
البته من یه این نتیجه رسیدم که تاریخ رو در جدول بدین شکل ذخیره کنم13910611 وبعد بیام اونو منهای 13910611 کنم واگه 5جواب تفریق 5 دراومد بعدش بیام نشون بدم این کار با اsql امکان پذیره ؟

Directx
پنج شنبه 27 مهر 1391, 16:57 عصر
من با توابع سیستمی در sql server زیاد آشنا نیستم ولی اگر تاریخ به صورت رشته در پایگاه ذخیره می شه با استفاده از توابع string در sqlserver حذف اسلش ها به راحتی صورت می گیره منظورم اینه که یه تابع تو sql بنوسید که اختلاف رو براتون برگردونه

boysilent
پنج شنبه 27 مهر 1391, 17:18 عصر
منم دنبال همون تابع هستم یکم بحث تحصصی هستش

Directx
پنج شنبه 27 مهر 1391, 17:35 عصر
ببین از SSMS به قسمت string functions < System functions < functions< programmability می تونی این توابع رو ببینی از این توابع مثل substring برای نوشتن یه sp یا تابع استفاده کن که برات این مقایسه رو انجام بده ولی در کل بهتر بود که تاریخ رو به همون صورت date time تو پایگاه ذخیره می کردید و فقط موقع نمایش اون رو به شمسی تبدیل می کردید

veniz2008
پنج شنبه 27 مهر 1391, 17:48 عصر
سلام.اگر بخواید با رشته ها این کار رو انجام بدید دردسرتون زیاد میشه ولی اگر تبدیل به نوع datetime کنید براحتی میتونید از تابع datediff ، تفاوت بین دو تاریخ رو بدست بیارید.

boysilent
پنج شنبه 27 مهر 1391, 17:56 عصر
شما این ادرس رو تو کروم قسمت گفتید ؟؟؟کدوم نرم افزار؟؟
من در حد اماتور هستم البته

Directx
پنج شنبه 27 مهر 1391, 18:03 عصر
microsoft sqlserver managment studio

boysilent
پنج شنبه 27 مهر 1391, 18:17 عصر
سلام.اگر بخواید با رشته ها این کار رو انجام بدید دردسرتون زیاد میشه ولی اگر تبدیل به نوع datetime کنید براحتی میتونید از تابع datediff ، تفاوت بین دو تاریخ رو بدست بیارید.

مشکلی نداره تبدیلش میکنم؟؟میشه بیشتر توضیح بدید؟؟؟

Mahmoud.Afrad
پنج شنبه 27 مهر 1391, 18:21 عصر
برای بدست آوردن تاریخ چندروز قبل یک تاریخ شمسی(اضافه یا کم کردن چند روز از یک تاریخ شمسی)، میتونید از متد زیر استفاده کنید:

private string AddDaysToPersianCalendar(string persianDate, int daysForAdd)
{
List<string> strDate = persianDate.Split('/').ToList();
int year = int.Parse(strDate[0]),
month = int.Parse(strDate[1]),
day = int.Parse(strDate[2]);
DateTime date = new DateTime(year, month, day, new PersianCalendar()); // <-- change persian calendar to datetime
PersianCalendar persianCalendar = new PersianCalendar();
date = persianCalendar.AddDays(date, daysForAdd);

year = persianCalendar.GetYear(date);
month = persianCalendar.GetMonth(date);
day = persianCalendar.GetDayOfMonth(date);

strDate[0] = year.ToString();
if (month < 10)
strDate[1] = "0" + month;
else
strDate[1] = month.ToString();
if (day < 10)
strDate[2] = "0" + day;
else
strDate[2] = day.ToString();
return (strDate[0] + "/" + strDate[1] + "/" + strDate[2]);
}


persianDate تاریخ شمسی معیار هست
daysForAdd تعداد روزی که میخواهید اضافه کنید. برای کم کردن عدد منفی بدید.

به اینصورت میتونید استفاده کنید:
string strDateForSelect = AddDaysToPersianCalendar("1391/10/05", -5);

// use strDateForSelect in sql command

مقدار بازگشتی هم رشته ای حاوی تاریخ چند روز قبل یا بعد خواهد بود که از این تاریخ میتونید در کوئری روی دیتابیس استفاده کنید.

boysilent
پنج شنبه 27 مهر 1391, 18:30 عصر
من که متوجه نمیشم اینهمه کار واسه چیه//ببخشیدا ولی این کد واسه تبدیله چیه؟؟؟
من فقط میخوام یه کوئری بگیرم با اسکیوال داخل سی شارپ همین؟؟ورودی تاریخ رو هم اینجوری با dll گرفتم 1391/10/10
txtdate.Text = PersianDate.Now.ToShortDateString();
txtdatekamel.Text = PersianDate.Now.ToLongDateString();
string datekotah = txtdate.Text;
int date1 = Int32.Parse(datekotah.Replace("/", ""));
MessageBox.Show(date1.ToString());
DataTable dt = new DataTable();
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Resources\dbcn.mdf;Integrated Security=True;User Instance=True");
SqlDataAdapter da = new SqlDataAdapter("select * from newbuy WHERE datecompare= '"++"'",conn);
da.Fill(dt);
dataGridView1.DataSource = dt;

Mahmoud.Afrad
پنج شنبه 27 مهر 1391, 18:40 عصر
مگر نگفتید میخواهید به یک تاریخ شمسی چند روز اضافه یا کم کنید؟! خب اون متد رو به کلاستون اضافه کنید و همونطور که گفتم استفاده کنید دیگه:
اینطوری 5 روز قبل txtdate.Text را میتونید بدست بیارید و در کوئری استفاده کنید
string strDateForSelect = AddDaysToPersianCalendar(txtdate.Text, -5);

DataTable dt = new DataTable();
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Resources\dbcn.mdf;Integrated Security=True;User Instance=True");
SqlDataAdapter da = new SqlDataAdapter("select * from newbuy WHERE datecompare= '" + strDateForSelect + "'", conn);
da.Fill(dt);
dataGridView1.DataSource = dt;

Directx
پنج شنبه 27 مهر 1391, 18:43 عصر
ببین اون فیلدتو به جای nchar از نوع date time تعریف کن خوب!
حالا هر تاریخی که می خوایی رو ذخیره می کنی
هر موقع خواستی تاریخ ها رو مقایسه یا کم یا جمع یا ... انجام بدی به راحتی از کلاس datetime استفاده می کنی
حالا کامپوننت ها ی زیادی برای تبدیل میلادی به شمسی و برعکس وجود داره که هر جا لازمه می تونی استفاده کنی
این اصولشه بالاخره نفهمیدم مشکل اصلی شما با این کار چیه حالا هر جور دوست داری انجامش بده

boysilent
پنج شنبه 27 مهر 1391, 19:14 عصر
ممنون ولی من دقیق نمیدونم چطوری از این استفاده کنم//ایا این بصورت یک dll هست باید دانلودش کنم ؟؟
بعد اون تاریخ داخل پایگاه هم شمسیه باید تبدیل بشه؟؟؟
ای خدا

این خطاشه
Error 2 The type or namespace name 'PersianCalendar' could not be found (are you missing a using directive or an assembly reference?) C:\Users\bcmodir\Documents\Visual Studio 2010\Projects\frmsabt\frmsabt\Form1.cs 28 13 frmsabt

Directx
پنج شنبه 27 مهر 1391, 20:25 عصر
خوب برادر من شما dll رو به refrence هات اضاف کن ولی بدون کامپوننت هم خیلی راحته الان که حسش نی ولی فردا برات یه مثال میذارم که مشکلت حل شه

boysilent
پنج شنبه 27 مهر 1391, 21:18 عصر
دوستان فضای نام هم دادم ولی این خطا رو میدههه

Error converting data type varchar to bigint
نمیدونم چرا به تبدیل متغیرا گیر میده

boysilent
پنج شنبه 27 مهر 1391, 22:20 عصر
مشکل حل شد ولی فقط تاریخ 5 روز قبل رو نشون میده من میخوااام طی 5 روز هم نشون بده تا دقیقا برابر تاریخ بشه///

Mahmoud.Afrad
پنج شنبه 27 مهر 1391, 22:36 عصر
یعنی از تاریخ txtdate.Text تا 5 روز قبلش رو میخوای؟ خوب کوئری رو به اینصورت بنویس:
SqlDataAdapter da = new SqlDataAdapter("select * from newbuy WHERE datecompare >= '" + strDateForSelect + "' and datecompare <= '" + txtdate.Text +"'" , conn);

boysilent
جمعه 28 مهر 1391, 09:03 صبح
یعنی از تاریخ txtdate.Text تا 5 روز قبلش رو میخوای؟ خوب کوئری رو به اینصورت بنویس:
SqlDataAdapter da = new SqlDataAdapter("select * from newbuy WHERE datecompare >= '" + strDateForSelect + "' and datecompare <= '" + txtdate.Text +"'" , conn);


نه این هم جواب نداد من میخوام یعنی اگه امروز 25 هست و تاریخ چک مثلا 30 هست از امروز که 25 هست تا 30 ماه این کوری رو نشون بده

boysilent
جمعه 28 مهر 1391, 17:29 عصر
نمیدونم بد توضیح میدم ///من مثلا ادرس امروزم 1390/07/25
. تاریخ داخل پایگاه داده 1390/07/30

یعنی این تاریخ هم امروز هم فردا هم پس فردا هم پستر فردا نشون داده بشه /
و وقتی تاا ریخ شد 31/07/1390 دیگه نشون نده