我正在尝试使用一个按钮来查找所有3年以上的记录。我在一个组合框上有一个按钮(名为Expiring
),该按钮搜索表Intro Date
中的字段RECS
。这是我所拥有的:
Private Sub Expiring_Click()
Call Search
End Sub
Sub Search()
Dim task As String
Me.Refresh
task = "SELECT * FROM RECS WHERE DateDiff('m', Date(), [Intro Date])" > 36
DoCmd.ApplyFilter task
End Sub
这不起作用,我的task
行的类型不匹配。我只想要一个仅显示3年数据的按钮。 。
我对MS-ACCESS和SQL / VBA非常陌生。这段代码基于我创建的另一个函数,该函数搜索Intro Date
是否早于无边界框中指定的日期。
答案 0 :(得分:1)
正确的代码行
task = "SELECT * FROM RECS WHERE DateDiff('m', Date(), [Intro Date]) > 36"
您正在将文本与数字36进行比较,结果是布尔值而不是字符串
答案 1 :(得分:1)
正如其他人所述,您的代码存在的问题是比较运算符位于SQL语句之外-
task = "SELECT * FROM RECS WHERE DateDiff('m', Date(), [Intro Date])" > 36
应该是:
task = "SELECT * FROM RECS WHERE DateDiff('m', Date(), [Intro Date]) > 36"
使用DateDiff
函数计算时间差时,请注意选择间隔参数会影响结果的准确性。
例如,直观的解决方案可能是通过为DateDiff
函数提供yyyy
间隔和两个有问题的日期来计算三年范围,并简单地检查结果是否更大比3:
DateDiff("yyyy", Date(), [Intro Date]) > 3
但是,请注意,这将省略所有年份组成部分相差3
或更小的日期,而不是相距恰好不超过3年的日期-意味着最多可能花费一年的时间从结果中排除:
?datediff("yyyy", #2018-01-01#, #2021-01-01#) ' 3 years apart
3
?datediff("yyyy", #2018-01-01#, #2021-12-31#) ' 3 years + 364 days apart
3
类似地,如果您选择月份间隔(m
),则未来三年的剩余月份也将被排除:
?datediff("m", #2018-01-01#, #2021-01-01#) ' 3 years apart
36
?datediff("m", #2018-01-01#, #2021-01-31#) ' 3 years + 30 days apart
36
很明显,我们现在可以进行无限回归:如果选择了天,则时间部分将被忽略,如果选择了小时,则分钟部分将被忽略,这是无限的…… >
因此,最终,时间间隔的选择取决于应用程序的要求:如果您的应用程序要求某项内容过期或正好在日期 3年之内验证,那么如果使用{{1 }}函数中,应使用天间隔(DateDiff
)(请注意,这将包括leap日,因此,得出的日期可能是3年之前的一天);如果允许该月的剩余时间,则月间隔(d
)就足够了。