2009-10-07 136 views
1

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

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

然而,这不返回发生指定的结束日期的行。

我已经试过CDATE,格式,则DateValue的每一个组合,我能想到的,其中用于包装一个或所有这些领域,但我总是收到相同的神秘的错误:

The expression is typed incorrectly, or it is too complex to be evaluated. For example, a numeric expression may contain too many complicated elements. Try simplifying the expression by assigning parts of the expression to variables.

一些例子的条件我曾尝试:

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 

等等

任何输入到这将不胜感激:)

回答

2

发生什么事情是,您的短日期输入在用户输入的当天开始的午夜产生日期时间值。因此,2009年1月1日至2009年1月10日的范围(或您的系统中使用的任何简短日期格式)正在搜索1月1日开始至1月10日开始的事件, 1月10日晚些时候发生的事件。

要更正,请将用户放入搜索的结束日期加1。这将从1月1日开始到1月11日开始搜索,包括1月10日的所有事件。

最后,发生在事件正好午夜1月11日的可滑动到您的结果这种方式,所以不是用你们之间应该使用

studystartdatetime> =形式!frmMain!txtStartDate和studystartdatetime <形式!frmMain!txtEndDate + 1

+0

我曾考虑过这样做,但出于某种原因,只是认为不可能添加到这样的日期值。无论如何,谢谢! – Richard 2009-10-07 17:33:16

0

Larry的回答对你来说是正确的答案,但让我列举一些在这里提出的问题。

  1. 你需要的日期格式和日期存储之间进行区分。在Jet/ACE数据库引擎(Access的默认数据库引擎)中,日期存储为一天中的整数和时间的小数部分。这就是为什么你可以添加一个数字(或一个小数)到一个日期并得到一个正确的结果,因为该日期的基本表示的整个数字部分表示自1899年12月30日以来的天数(它不是Dec的原因第三十一号是复杂的 - 有人在计算闰年时搞砸了,所以一大堆程序写的是关于1899年12月31日实际上是什么时候的错误假设)。

  2. “短日期” 是一个日期格式,标准的M/d/YY(或m/d/yyyy的,这取决于Windows和访问两个本地设置)。它与存储在表格中的实际基础日期值无关,但如果使用格式化结果,则会产生巨大影响。例如,Format(Date(),“m/d/yyyy”)返回一个字符串,而不是日期值。这是一个可以隐式强制为日期值的字符串,而且通常透明地依赖于该字符串。但是您仍然必须了解Format()函数返回一个字符串,并且该字符串不会始终被视为日期。

  3. 喷气/ ACE SQL预计格式的日期在美国的顺序传递,反直觉的M/d/yyyy的,而不是更合乎逻辑的d/M/yyyy或更好的是,ISO标准YYYY /平方米/ d。正因为如此,只要您使用为Windows设置的非美国语言环境运行您的应用程序,就需要明确您的日期。这意味着将日期转换为非歧义格式(d/mmm/yyyy可行,因为它指定了数字中的日期和字母中的月份),或者使用DateSerial()函数处理所有日期。这适用于WHERE子句中的日期条件或SELECT语句中正在进行日期计算的任何地方 - 将日期以非歧义格式或DateSerial()传递给函数,您将避免此问题。