2017-02-23 18 views
0

私はSQLを初めて使っています。基本的に私は、「日付」という名前の列を持つデータベースを持っている、と私はそのような「日付」frmは、Windowsフォームの日付時刻ピッカーで 日付の範囲に基づいてレコードを検索する

Dim myStr As String = String.Format("Select * from {0} where [Date] between @date1 and @date2", databaseTableName) 

Dim ad As New SqlDataAdapter(myStr, sqlConn) 

ad.SelectCommand.Parameters.AddWithValue("@date1", frm.StartDate.Value.ToString("dd/MM/yyyy")) 
ad.SelectCommand.Parameters.AddWithValue("@date2", frm.EndDate.Value.ToString("dd/MM/yyyy")) 

startDate間と endDate

であるすべてのエントリを返すようにしたいです。

どこが間違っていたのかわかりませんが、クエリで何も返されません。

+3

クエリで日付を渡すことになっていると、あなたはToString' 'を呼び出します。バイナリの 'Date'値を' String'に変換しないでください。あなたが実際にしたいのは、あなたがしている時間をゼロにすることです。つまり 'frm.StartDate.Value.Date'を使います。 – jmcilhinney

答えて

1
Dim myStr As String = String.Format("SELECT * FROM {0} WHERE [Date] >= @date1 AND < @date2", databaseTableName) 

Dim ad As New SqlDataAdapter(myStr, sqlConn) 

ad.SelectCommand.Parameters.Add("@date1" SqlDbType.DateTime).Value = frm.StartDate.Value.Date 
ad.SelectCommand.Parameters.Add("@date2", SqlDbType.DateTime).Value = frm.EndDate.Value.Date.AddDays(1) 
-1

'dd/MM/yyyy'に設定すると、SQLはエラー '' varcharデータ型からDateTimeデータ型への変換が範囲外の値になりました 'というエラーを返します。私はあなたが以下のようにフォーマットを設定すべきだと思います。

ad.SelectCommand.Parameters.AddWithValue("@date1", frm.StartDate.Value.ToString("yyyy/MM/dd")) 
ad.SelectCommand.Parameters.AddWithValue("@date2", frm.EndDate.Value.ToString("yyyy/MM/dd")) 
+1

文字列を使用してクエリの日付値を設定する場合、それでもやはり間違っています。 –

+0

@JoelCoehoorn:文字列を使って日付の値を設定できないのはなぜですか?これは例です:Person.Person からのトップ10のFirstName、ModifiedDate を選択します。ここでModifiedDateは '2009/01/10'と '2009/01/20'の間です – Tomato32

+0

いくつかの理由があります。 1つは、サーバーが実際に期待する日付形式と異なる可能性があるということです。あなたがドイツで顧客を得るまで、または誰かがAzureインスタンスの間違った地域を選ぶまでは、楽しいゲームです。別の理由は[パフォーマンス](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)です。 @JoelCoehoorn。 –

関連する問題