Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Access 2007:查询两个短日期值之间的日期时间字段_Sql_Database_Ms Access_Ms Access 2007 - Fatal编程技术网

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

Sql Access 2007:查询两个短日期值之间的日期时间字段,sql,database,ms-access,ms-access-2007,Sql,Database,Ms Access,Ms Access 2007,我有一个表单,其中包含两个文本框供用户输入。两个文本框的属性格式都设置为“短日期”。一个是“开始日期”,另一个是“结束日期”。我还有几个表,每个表都有一个DateTime字段(“studystartdatetime”)。我希望能够查询这些表,但将结果限制为DateTime字段位于输入日期(包括)之间的行。目前的情况是: WHERE s.studystartdatetime BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddat

我有一个表单,其中包含两个文本框供用户输入。两个文本框的属性格式都设置为“短日期”。一个是“开始日期”,另一个是“结束日期”。我还有几个表,每个表都有一个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
等等


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

现在发生的是,您的短日期输入在用户输入当天的午夜生成日期时间值。因此,范围从2009-1-1到2009-1-10(或系统上使用的任何短日期格式)搜索从1月1日开始到1月10日开始的事件,并排除1月10日晚些时候发生的事件

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

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


studystartdatetime>=表单!弗曼!txtStartDate和studystartdatetime拉里的回答对你来说是正确的,但让我列举一下这里提出的一些问题

  • 您需要区分日期格式和日期存储。在Jet/ACE数据库引擎(Access的默认数据库引擎)中,日期存储为当天的整数,时间存储为十进制部分。这就是为什么您可以在日期上添加一个数字(或十进制)并得到正确的结果,因为日期的基本表示形式的整数部分表示自1899年12月30日以来的天数(不是12月31日的原因很复杂——有人在计算闰年时出错了,所以写了一大堆程序,错误地假设1899年12月31日是什么时候)

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

  • Jet/ACE SQL希望格式化的日期以美式顺序传递,即反直觉的m/d/yyyy,而不是更符合逻辑的d/m/yyyy,或者更好的是,ISO标准yyyy/m/d。因此,任何时候,当您在非美国地区为Windows设置的情况下运行应用程序时,您都需要明确您的日期。这意味着您需要强制转换日期以不含糊的格式(d/mmm/yyyy有效,因为它以数字指定日期,以字母指定月份),或使用DateSerial()处理所有日期函数。这适用于WHERE子句中的日期条件,或SELECT语句中正在进行日期计算的任何位置——以不含糊的格式或使用DateSerial()将日期传递到函数中,可以避免此问题


  • 我曾考虑过这样做,但出于某种原因,我只是认为不可能添加这样的日期值。无论如何,谢谢!