一尘不染

Access 2007:查询两个短日期值之间的DateTime字段

sql

我有一个包含两个文本框供用户输入的表单。两个文本框的“属性”格式均设置为“短日期”。一个是“开始日期”,另一个是“结束日期”。我也有几个表,每个表都有一个DateTime字段(“studystartdatetime”)。我希望能够查询这些表,但将结果限制为DateTime字段介于输入的日期(含)之间的行。当前,条件是:

WHERE s.studystartdatetime BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

但是,这不会返回在指定的结束日期发生的行。

我已经尝试过将CDate,Format和DateValue的每种组合都包装在其中一个或所有这些字段中,但是我总是收到相同的神秘错误:

表达式的输入错误,或者太复杂而无法求值。例如,一个数字表达式可能包含太多复杂的元素。尝试通过将表达式的一部分分配给变量来简化表达式。

我尝试过的一些条件示例:

WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd"))

WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd"))

WHERE DateValue(Format(s.studystartdatetime, "Short Date")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

等等。

任何对此的投入将不胜感激:)


阅读 173

收藏
2021-05-16

共1个答案

一尘不染

发生的情况是,您输入的短日期在用户输入的当天开始的午夜产生datetime值。因此,范围2009-1-1到2009-1-10(或系统上使用的任何短日期格式)正在搜索从1月1日
开始 到1月10日 开始 的事件,但不包括发生在1月10日晚些时候。

若要更正,请在用户输入搜索的结束日期前加1。搜索时间从1月1日开始到1月11日开始,包括1月10日的所有事件。

最终,发生在1月11日午夜 恰好 发生的事件可以通过这种方式进入您的结果,因此,您应该使用BETWEEN而不是

studystartdatetime >= forms!frmMain!txtStartDate AND studystartdatetime < forms!frmMain!txtEndDate + 1

2021-05-16