【问题标题】:Filtering for dates less than or or equal to 9 months in the future in an Access query在 Access 查询中筛选未来小于或等于 9 个月的日期
【发布时间】:2015-03-06 23:18:48
【问题描述】:

我需要每周运行一次报告,在其中查询 Access 数据库中将在 9 个月或更短时间内到期的任何产品。他们希望计算的方式是将日期移至未来 9 个月,并返回在该月末或更早到期的任何内容。如果它只是 270 天或更短,我没有问题。 (如果我可以在 Excel 中完成,我也没有问题,但目前这不是一个选项。

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

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

所以基本上我是:

  • 今天的日期加上 270 天
  • 提取结果月份
  • 月份加 1
  • 将其作为文本字符串重新组合在一起,以便我可以使用
  • 对于这一年,我使用的是从日期 +270 天开始的年份,所以我最终不会意外使用当前年份

问题在于,对于上面的日期范围(我今天不高兴地发现),我在 12 月着陆,当我加上 270 天时,所以下个月是不同的年份。结果,我的报告只生成了已经过期的项目。

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

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

【问题讨论】:

  • “我想到了使用” - 如果您想到使用 DateAdd 函数,就像在 DateAdd("m", 9, Date()) 中那样,那么这将是朝着正确方向迈出的一步。

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


【解决方案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)

【讨论】:

  • 我添加了那些缺少的括号。谢谢。
  • 这很好用。由于我还没有真正接触过实际的 SQL,因此我直接在查询中使用了 /DateDiff("m",Date(),[Expiration_Date])
【解决方案2】:

使用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)

【讨论】:

  • 这很有帮助,但另一个答案要简单一些。不过,我会回到这一点,以便更好地理解 SQL。谢谢!
猜你喜欢
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
相关资源
最近更新 更多