Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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_Sql_Vba_Ms Access - Fatal编程技术网

用于获取单个日期上的所有日期/时间的SQL

用于获取单个日期上的所有日期/时间的SQL,sql,vba,ms-access,Sql,Vba,Ms Access,我有一个表,其中的行包含一个日期/时间,其中填充了约会时间。约会时间是一个单独的字段,即日期和时间。我创建了一个记录集,用于获取在给定日期发生的所有约会: Dim dt as date dt = #3/2/2019# Set rs = Currentdb.OpenRecordSet("SELECT stuff FROM Appt WHERE Int(Appt.apptTime) = #" & dt & "#") -------- 这是可行的,但Int函数使其效率低下。一种

我有一个表,其中的行包含一个日期/时间,其中填充了约会时间。约会时间是一个单独的字段,即日期和时间。我创建了一个记录集,用于获取在给定日期发生的所有约会:

Dim dt as date

dt = #3/2/2019#

Set rs = Currentdb.OpenRecordSet("SELECT stuff FROM Appt WHERE 
Int(Appt.apptTime) = #" & dt & "#") --------
这是可行的,但Int函数使其效率低下。一种解决方案是将日期/时间字段分为两个字段date和time,然后只搜索date字段。不幸的是,我没有修改数据库结构的选项


有没有人建议我如何使此提取更有效?

我刚刚想出了一个解决方案:


其中Appt.apptTime>&dt&和Appt.apptTime<&dt+1&

可以使用DateValueAppt.apptTime

例如:

上面只返回日期部分,删除时间部分

但是,上述方法不能使用高速索引。因此,你的回答如下:

WHERE (Appt.apptTime > #" & dt & "#) AND (Appt.apptTime < #" & dt + 1 & "#")
然后,您的查询变成:

WHERE (Appt.apptTime > " & qudateT(dt) & ") AND (attt.apptTime < " & qudateT(dt + 1)
在你的例子中,DT没有时间,所以qudate的时间部分是00:00:00


因此,您的示例后续操作应该可以工作,但您希望强制日期格式为MM/DD/YYYY USA格式,并且如果用户具有诸如DD/MM/YYYY之类的设置,那么您的示例查询将在具有此类不同区域设置的计算机上失败。

您必须正确设置日期表达式的格式,并记住相等选项:

Set rs=Currentdb.openrecordsets从Appt中选择内容,其中Appt.apptTime>=&Formatdt,yyyy\/mm\/dd&和Appt.apptTime<&FormatDateAddd,1,dt,yyyy\/mm\/dd&
我不明白为什么日期格式很重要,因为无论显示的格式如何,所有日期都存储为双精度浮点数。整数部分是自1899年12月30日起的天数;分数部分为24小时工作日的分数。因此,我在更新版中的计算发现了一个解决方案,它将日期视为数字,应该不受为显示日期选择的任何日期格式的影响,对吗

我不明白为什么日期格式很重要,因为所有日期,无论显示的格式如何,都存储为双精度浮点数。整数部分是自1899年12月30日起的天数;分数部分为24小时工作日的分数。因此,我的计算,即将日期视为数字,应该不受为显示日期选择的任何日期格式的影响,对吗?在构建sql字符串时,这确实很重要。使用像表单一样的直接表达式!frmName!sql中的列名,则没有问题。当您开始创建带有内置字符串的where子句时,该字符串将采用区域设置。您这样做的那一刻,就是您根据计算机区域设置编写代码的那一刻。因此,区域设置除了MM/DD/YYYY之外,您的代码将开始失败。所以一个直接的形式!表达式是可以的,但任何类型的字符串concat都会将日期强制转换为字符串,结果是区域格式-而不是美国格式。请在调试窗口中执行此操作:?&约会&看看你得到了什么。结果表达式的类型为string。因此,对于where子句,您需要:&date&。这同样会产生一个字符串。转换一个变量,比如说dt,甚至使用date,或者now,都会吐出一个字符串——它会根据您的区域设置吐出。因此,您处理的不是内部日期格式,而是日期作为字符串的外部表示形式。如前所述,该字符串将根据您的区域设置吐出,但该字符串必须格式化为USA格式。感谢您的澄清。我认为,在这种情况下,哈希标记只满足编译器的类型检查。要将日期视为数字,我应该输入:========================================dx=FixCDbldtEntered==================================。。。其中Appt.apptTime>&dx&和Appt.apptTime<&dx+1&===================我相信这在所有情况下都会起作用,对吗?嗯,它应该起作用,但表单上的控件采用您设置的实际数据类型。因此,如果将控件设置为format的数字,那么它将返回一种数字类型。如果将控件设置为Formatted to date,则它将返回实际的内部日期类型值。如果控件已绑定,则返回绑定列类型的实际数据类型。我不能说引入两种类型的铸造修复+cdbl比将值视为真正的日期类型更好。最好保留并假设实际的数据类型,然后尝试转换和更改数据类型。如前所述,如果使用表单!expresison和我建议他们,然后你得到一个真正的日期类型。如果您使用的是记录集代码,那么您也可以在不进行转换的情况下直接为记录集赋值。然而,我不会做所有的铸造时,建设字符串。我的意思是,你可以将日期转换为双倍,但你仍然像现在一样插入双倍 如果您正在构建sql,那么该sql中的所有内容都是一个字符串。那么,为什么要从日期->双->修复->字符串开始施放呢。为什么不从日期->字符串开始。
Public Function quDateT(dt As Date) As String

  ' return formatted date

  quDateT = "#" & Format(dt, "mm\/dd\/yyyy HH:NN:SS") & "#"


End Function
WHERE (Appt.apptTime > " & qudateT(dt) & ") AND (attt.apptTime < " & qudateT(dt + 1)