PDA

View Full Version : جستجو بین دو تاریخ شمسی با فرمت استرینگ



mohammad-gh
سه شنبه 24 اردیبهشت 1387, 10:38 صبح
با سلام
من در برنامه ای که نوشته ام نیاز به محاسبه رکوردها بین دو تاریخ شمسی را دارم.
تاریخ را با فرمت استرینگ و به صورت شمسی در بانک ذخیره کرده ام، حال می خوام ببینم چطوری می تونم آنها را با یک دستور select یا با یک حلقه جدا و پیدا کرده و داخل یک datatable یا dataset دیگر بریزم.
این رو هم می دونم اگه راه حلی نباشه می تونم یکی یکی اونها رو به تاریخ میلادی بر گردونم و با بازه تاریخی مقایسه کنم. اما نمی دونم در این صورت چه چطور اونها رو دوباره در datattable بریزم

touraj
سه شنبه 24 اردیبهشت 1387, 10:41 صبح
ببخشید. اما راستش من اصلاً نفهمیدم مشکلت چیه! یه کمی بیشتر توضیح میدی؟

Sub Zero
سه شنبه 24 اردیبهشت 1387, 10:46 صبح
Select DDate From MyTable Where (string.Format("DDate Between '{0}' And '{1}'", ADate.Text, ADateTo.Text))
ADate تاریخ شروع
ADateTo تاریخ پایان

touraj
سه شنبه 24 اردیبهشت 1387, 10:54 صبح
Select DDate Form MyTable Where (string.Format("DDate Between '{0}' And '{1}') ", ADate.Text, ADateTo.Text))
ADate تاریخ شروع
ADateTo تاریخ پایان

آره، راست میگیا! چه گاگولی هستم من:چشمک:

arsalansalar
سه شنبه 24 اردیبهشت 1387, 11:05 صبح
"Select * From data Where tdate >= " + textbox1.Text + " and tdate <= " + textbox2.Text + " Order By id desc"

mohammad-gh
چهارشنبه 25 اردیبهشت 1387, 14:01 عصر
با سلام و تشکر.
من از کد خواستم استفاده کنم ولی خطا می ده. این هم نوع استفاده ام.

objDataAdapter.SelectCommand.CommandText = "Select DDate Form MyTable Where (string.Format("DDate Between '{0}' And '{1}'", ADate.Text, ADateTo.Text))"

Sub Zero
چهارشنبه 25 اردیبهشت 1387, 18:18 عصر
با سلام و تشکر.
من از کد خواستم استفاده کنم ولی خطا می ده. این هم نوع استفاده ام.

objDataAdapter.SelectCommand.CommandText = "Select DDate Form MyTable Where (string.Format("DDate Between '{0}' And '{1}'", ADate.Text, ADateTo.Text))"

اگه دقیقا همین کد رو استفاده کردین باید بگم که Syntax مشکل داره Form رو با From تبدیل کنید.
البته اشکال ازمن بود . معذرت!

mohammad-gh
چهارشنبه 25 اردیبهشت 1387, 22:50 عصر
سلام .
نه مشکل تو from نیست ، اصلا فرمت دستور درست در نمی آید. فکر کنم تو کوتیشن هاش یه مشکلی است . بعد هم که یه فکری به حال اون می کنی از between ایراد می گیره.
بازهم ممنون . اگه می شه خودتون هم با coomand امتحان کنید.

Morteza_s
چهارشنبه 25 اردیبهشت 1387, 23:24 عصر
ببینید استفاده از نوع Text برای ذخیره تاریخ کار اشتباهیه
من یه پیشنهاد بهتون می کنم:
به نظر من بهترین کار این هست که شما دو فیلد در جدول ایجاد کنید
یکی برای ذخیره تاریخ به فرمت میلادی و از نوع Date/Time
و دیگری برای ذخیره مقدار تبدیل شده فیلد قبلی به تاریخ شمسی و نوع Text
خب، حالا خیلی راحت می تونید برای انجام محاسبات از فیلد تاریخ میلادی، و برای نمایش به کاربر در فرم برنامه یا در گزارشات از فیلد تاریخ شمسی استفاده کنید

حالا برای پیدا کردن رکوردهای بین دو تاریخ شما باید دو مقدار تاریخ به فرمت میلادی داشته باشید
از تاریخ == TextBox1.Text یعنی مقدار تاریخ اول
تا تاریخ == TextBox2.Text یعنی مقدار تاریخ دوم

اول باید چک کنید که کاربر تاریخ دوم رو مساوی یا کمتر از تاریخ اول وارد نکرده باشه و بعد محاسبه رو انجام بدید:



a = DateDiff(DateInterval.Day, TextBox1.Text, TextBox2.Text)

If a > 0 Then
objDataAdapter.SelectCommand.CommandText = " SELECT * FROM Table1 WHERE date1 >=#" & TextBox1.Text & "# AND date2<=#" & TextBox2.Text & "#"
End If

اگر از Access استفاده می کنید برای پیدا کردن فیلدهای نوع Date/Time باید از علامت # قبل و بعد از مقدار تاریخ استفاده کنید.

mohammad-gh
پنج شنبه 26 اردیبهشت 1387, 12:31 عصر
با سلام و تشکر از راهنمایی آقای morteza-s ، اما اینکه من بخواهم حدود 30 تیبل را دوباره باز نویسی کنم کمی ظلم است.
تعجب من از این است که در زمان طراحی هیچ کس در مورد این مشکل حرفی نگقته بود.
به هر حال امیدورام روش آقای Sub Zero درست عمل کند .

اما با یک روش دیگر هم می شود این رکوردها را جدا کرد که من یک جای آن را بلد نیستم .
بدین ترتیب که ما اول کل فیلدهای تاریخ جدول را یکی یکی به میلادی تبدیل وبعد با تاریخ ورودی مقایسه کنیم . اما نمی دانمم چطور دوباره در یک datatable یا dataset بریزیم.

Sub Zero
پنج شنبه 26 اردیبهشت 1387, 14:36 عصر
این یکی رو امتحان کنید امیداوارم جواب بده :

Using con As New OleDb.OleDbConnection("Your Connection")
con.Open()
Dim Cmd As New OleDb.OleDbCommand
With Cmd
.Connection = con
.CommandText = String.Format("Select DDate From MyTable Where (DDate Between '{0}' And '{1}') ", ADate.Text, ADateTo.Text)
Dim DT As New DataTable
DT.Load(.ExecuteReader)
End With
End Using

mohammad-gh
شنبه 28 اردیبهشت 1387, 12:16 عصر
آقا تشکر خیلی خوب هم کار کرد.

ali_md110
شنبه 28 اردیبهشت 1387, 23:48 عصر
Private Sub project_search()
Dim CNN As OleDbConnection
Dim DataReader As OleDbDataReader
Dim Command As OleDb.OleDbCommand
Dim cnnstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db.mdb"
CNN = New OleDbConnection(cnnstr)
Dim SQL As String = "SELECT * FROM(Table1)WHERE (((Table1.sdate) Between [@Adate] And [@Bdate]))ORDER BY Table1.sdate"
Command = New OleDbCommand(SQL, CNN)
Command.CommandType = CommandType.Text
Command.Parameters.Add("@Adate", Data.OleDb.OleDbType.VarChar, 10).Value = Me.txtdatefrom.Text
Command.Parameters.Add("@Bdate", Data.OleDb.OleDbType.VarChar, 10).Value = Me.txtdateto.Text
CNN.Open()
DataReader = Command.ExecuteReader
If DataReader.HasRows Then
mytbl = New DataTable
mytbl.Load(DataReader)
DataGridView1.DataSource = mytbl
Else
MsgBox("رکوردی پیدا نشد")
End If
DataReader.Close()
CNN.Close()
End Sub