我正在尝试查询.mdb数据库,这是VB.Net中SQL的一部分:
sql = sql + "WHERE datdatum BETWEEN #" & "15-10-2018" & "# And #" & "31-10-2018" & "#"
where子句以您假定的方式工作。目前,我将第一个日期从15-10-2018
更改为01-10-2018
,它显示的是Jan-10
而不是Oct-01
的所有记录。
答案 0 :(得分:7)
这里有两个问题。
首先,不要以这种方式格式化日期。用于SQL的日期应始终使用ISO8601格式。对于没有时间成分的仅日期值,出于某些原因,我们倾向于使用鲜为人知的标准格式的未分隔变体,但这仍然是ISO8601。因此,日期值应如下所示:
sql = sql + "WHERE datdatum BETWEEN #" & "20181015" & "# And #" & "20181031" & "#"
或者这个:
sql = sql + "WHERE datdatum BETWEEN #" & "2018-10-15" & "# And #" & "2018-10-31" & "#"
其他任何事情都只是在问您问题的种类,从字符串中读取的实际日期会根据进行解释的人员/设备的文化而有所不同。
此修补程序可能似乎可以单独使用,但是由于第二个问题,我们仍然需要做更多的工作:
请勿使用字符串条件将数据放入SQL查询中!
您应该始终构建如下查询:
sql = sql + " WHERE datdatum BETWEEN ? And ?"
只要不使用日期数据之类的数据,串联是可以的。然后,您可以像这样填充值(假设您有一个名为OleDbCommand
的{{1}}对象):
cmd
这完全避免了问题的格式问题,因为您正在使用.Net DateTime值。它有时可以运行得更快(尽管对于Access来说可能并不重要)。而且,它可以防止恶意和良性的SQL注入问题。 IMO的其他任何事情都是业余的,并且在职业渎职上是有界限的。