在 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 天
- 提取结果月份
- 月份加1
- 将它重新组合成一个文本字符串,这样我就可以在<下个月的第一天使用
- 对于年份,我使用的是从日期 +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)
每周一次,我需要运行 一份报告,我在其中查询 Access 数据库以查找将在 9 个月或更短时间内过期的任何产品。他们希望计算的方式是将日期计算为未来 9 个月和 return 任何在该月底或更早到期的日期。如果只是 270 天或更短,我就没有问题。 (如果我可以在 Excel 中做到这一点,我也没有问题,但现在这不是一个选项)。
我想出了一个适用于一年中每个月的解决方案,除非恰好是三月(更具体地说是在 3 月 6 日和 4 月 5 日之间)。
< DateValue(Month(Date()+270)+1 & "/1/" & Year(Date()+270))
基本上我是:
- 今天加上 270 天
- 提取结果月份
- 月份加1
- 将它重新组合成一个文本字符串,这样我就可以在<下个月的第一天使用
- 对于年份,我使用的是从日期 +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)