为什么此WHERE子句不返回正确的基准?

时间:2018-11-09 20:42:22

标签: sql vb.net ms-access

我正在尝试查询.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的所有记录。

1 个答案:

答案 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的其他任何事情都是业余的,并且在职业渎职上是有界限的。