在 Access 查询中筛选未来小于或等于 9 个月的日期

Filtering for dates less than or or equal to 9 months in the future in an Access query

每周一次,我需要运行 一份报告,我在其中查询 Access 数据库以查找将在 9 个月或更短时间内过期的任何产品。他们希望计算的方式是将日期计算为未来 9 个月和 return 任何在该月底或更早到期的日期。如果只是 270 天或更短,我就没有问题。 (如果我可以在 Excel 中做到这一点,我也没有问题,但现在这不是一个选项)。

我想出了一个适用于一年中每个月的解决方案,除非恰好是三月(更具体地说是在 3 月 6 日和 4 月 5 日之间)。

    < DateValue(Month(Date()+270)+1 & "/1/" & Year(Date()+270))

基本上我是:

麻烦的是,对于上面的日期范围(我今天不幸发现),我在添加 270 天时在 12 月登陆,所以下个月是不同的年份。结果,我的报告只生成了已经过期的项目。

换句话说,在 3 月 5 日,我需要一份清单,其中包含 12 月 1 日之前到期的所有内容,但在 3 月 6 日,我需要明年 1 月 1 日之前的所有内容。

有没有更有效的方法来避免这个问题?我想过用

使用 DateSerial Function 计算您需要的未来日期。

这是 Access Immediate window 中的一个演示,它计算从今天起 9 个月后的日期:

? Date
3/6/2015 
? DateSerial(Year(Date), Month(Date) + 9, Day(Date))
12/6/2015 

但是,据我了解您的要求,您实际上想要整个月的日期。在这种情况下,您可以计算从今天起 10 个月后的第一个月,并要求所有小于该日期的内容。

? DateSerial(Year(Date), Month(Date) + 10, 1)
1/1/2016 

您可以像这样在查询中包含该表达式...

WHERE expire_date < DateSerial(Year(Date()), Month(Date()) + 10, 1)

你可能已经想到了DateDiff,可以使用它:

Where DateDiff("m", Date(), [YourDateField]) Between 0 And 9

但是,这将忽略您在 [YourDateField] 上可能拥有的索引。

但是,这将包括当月之前过期的产品。

替代方案是 Hans 展示的 DateSerial,但他忘记了在 SQL 中必须使用 Date() 并且只应列出那些将过期的产品:

 Where [YourDateField] Between Date() And DateSerial(Year(Date()), Month(Date()) + 10, 0)