用于获取单个日期上的所有日期/时间的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)