2017-02-23 222 views
0

我對SQL很陌生。基本上,我有一個名爲「日期」一欄的數據庫,我想返回所有的條目,從而「日期」是startDateendDate之間根據日期範圍查找記錄

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")) 

其中frm是一個Windows窗體日期時間選擇器。

不知道我錯了,但查詢不返回任何東西。

+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

之間幾個原因。一個是服務器實際上可能有你期望的不同日期格式。除非您在德國獲得客戶,或者某人選擇了Azure實例的錯誤區域,否則這些都是有趣和有趣的遊戲。另一個原因是[性能](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)。 –