为什么这个WHERE子句没有返回正确的基准?

0 sql vb.net ms-access

我正在尝试查询.mdb数据库,这是VB.Net中SQL的一部分:

sql = sql + "WHERE datdatum BETWEEN #" & "15-10-2018" & "# And #" & "31-10-2018" & "#"
Run Code Online (Sandbox Code Playgroud)

where子句按照您的方式工作.目前我将第一个日期更改15-10-201801-10-2018,它显示所有记录Jan-10而不是Oct-01.

Joe*_*orn 7

这里有两个问题.

首先,不要那样格式化日期.用于SQL的日期应始终使用ISO8601格式.对于没有时间分量的仅限日期的值,有一些理由偏爱标准格式的鲜为人知的未分离变体,但仍然是ISO8601.所以日期值应如下所示:

sql = sql + "WHERE datdatum BETWEEN #" & "20181015" & "# And #" & "20181031" & "#"
Run Code Online (Sandbox Code Playgroud)

或这个:

sql = sql + "WHERE datdatum BETWEEN #" & "2018-10-15" & "# And #" & "2018-10-31" & "#"
Run Code Online (Sandbox Code Playgroud)

其他任何东西只是在你的问题中乞求那种问题,其中从字符串中读取的实际日期根据进行解释的人/设备的文化而变化.

这个解决方案似乎可以自行解决,但由于第二个问题,我们仍需要做更多的工作:

不要使用字符串连接将数据输入SQL查询!

您应该始终更像这样构建查询:

sql = sql + " WHERE datdatum BETWEEN ? And ?"
Run Code Online (Sandbox Code Playgroud)

只要没有使用数据(例如日期值),连接就可以了.然后你填充这样的值(假设你有一个OleDbCommand名为的对象cmd):

cmd.Parameters.Add("?", OleDbType.Date).Value = DateTime.Parse("2018-10-15")
cmd.Parameters.Add("?", OleDbType.Date).Value = DateTime.Parse("2018-10-31")
Run Code Online (Sandbox Code Playgroud)

这完全避免了问题的格式问题,因为您正在使用.Net DateTime值.它有时可以运行得更快(尽管它可能对Access无关紧要).它可以防止恶意和良性的SQL注入问题.IMO其他任何东西都是业余的,并且与专业的医疗事故接壤.

  • Access无法理解未分离的ISO8601并将返回语法错误.它需要斜线或破折号.在所有其他帐户上,这是一个很好的答案. (2认同)