MS-ACCESS查找3年以上的数据

时间:2018-12-27 21:34:26

标签: ms-access

我正在尝试使用一个按钮来查找所有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是否早于无边界框中指定的日期。

2 个答案:

答案 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函数计算时间差时,请注意选择间隔参数会影响结果的准确性。

例如,直观的解决方案可能是通过为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)就足够了。