在一段时间之前,我使用代码来获取数据库中两个日期之间的日期(日期为dd / mm / yy的列),我认为它第一次运行良好,代码是:
Dim b As New Date
Dim a As Integer
a = Val(tx2.Text)
b = System.DateTime.Today
b = b.AddDays(-a)
MsgBox(b)
Conn.Open()
SQLstr = " Select * from tb where lastvstart BETWEEN #01/01/1800# AND #" & b & "#"
Dim DataAdapter1 As New OleDbDataAdapter(SQLstr, Conn)
DataSet1.Clear()
DataAdapter1.Fill(DataSet1, "Tb")
Conn.Close()
如您所见,代码允许用户插入一个数字并将其减去今天的日期,然后计算我想要的日期,之后我使用BETWEEN子句来获取它们之间的所有日期
但是现在,这段代码获取了一些数据并超越了其他数据,我的意思是某些日期介于两个日期之间,但代码永远不会得到它,为什么会这样?
答案 0 :(得分:2)
如果查看生成的SQL字符串,它是否包含您期望的日期?我假设数据库要求它遵循特定格式(给定查询中的硬编码日期,dd/MM/yyyy
或MM/dd/yyyy
。当创建日期的字符串版本并将其插入到SQL查询中时,您的日期和月份是否可以切换位置?
作为旁注,我强烈建议不要像这样连接SQL查询。如果可能,请使用参数化查询。这可能还会删除一些类型转换问题。
<强>更新强>
以下是通过OLE DB对Access数据库使用参数化查询的示例:
Using connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\path\file.mdb""")
Using cmd As New OleDbCommand("select * from tb where lastvstart BETWEEN ? AND ?", connection)
Dim param As OleDbParameter
' add first date '
param = New OleDbParameter()
param.DbType = DbType.Date
param.Value = New DateTime(1800, 1, 1)
cmd.Parameters.Add(param)
'add second date '
param = New OleDbParameter()
param.DbType = DbType.Date
param.Value = DateTime.Today.AddDays(-a)
cmd.Parameters.Add(param)
cmd.Parameters.Add(New OleDbParameter())
connection.Open()
Using adapter As New OleDbDataAdapter(cmd)
Using ds As New DataSet()
adapter.Fill(ds)
Console.WriteLine(ds.Tables(0).Rows.Count)
End Using ' DataSet '
End Using ' OleDbDataAdapter '
End Using ' OleDbCommand '
End Using ' OleDbConnection '
答案 1 :(得分:1)
你能不能将Sqlstr改为
SQLstr = " Select * from tb where lastvstart <= '" & b.ToString("dd MMM yyyy") & "'";
编辑,根据数据库进行更改
使用此字符串并检查其是否有效
SQLstr = " Select * from tb where lastvstart <= #" & b.ToString("dd MMM yyyy") & "#";