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

时间:2015-03-06 23:18:49

标签: date ms-access ms-access-2007

每周一次,我需要运行一个报告,在该报告中查询Access数据库,查找将在9个月或更短时间内过期的任何产品。他们想要计算的方式是将日期记录到未来9个月,并返回在该月末或更早到期的任何内容。如果它只是270天或更短,我没有问题。 (如果我能在Excel中完成,我也没有问题,但现在不能选择。)

我提出了一个解决方案,每年的每个月都有效,除非它恰好是3月(更具体地说是在3月6日到4月5日之间)。

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

所以基本上我是&#39; m:

  • 将270天添加到今天的日期
  • 提取结果月份
  • 每月加1
  • 将其作为文本字符串重新组合在一起,以便我可以使用&lt;下个月的第一天
  • 这一年,我使用的日期为+270天,所以我不会意外地使用当前年份

麻烦的是,对于上面的日期范围(我今天不幸地发现),我在12月份登陆时加上270天,所以接下来的一个月是在另一年。因此,我的报告仅生成已过期的项目。

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

是否有更有效的方法可以避免此问题?我想过要用

2 个答案:

答案 0 :(得分:2)

您可能已经考虑过DateDiff,可以使用它:

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

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

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

另一种选择是DateSerial,正如Hans所示,但他忘记了在SQL中必须使用Date(),并且只列出那些将过期的产品:

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

答案 1 :(得分:1)

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

以下是Access Immediate窗口中的演示,该窗口计算从今天起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)