计算日期是否在给定范围内

时间:2012-02-13 20:35:11

标签: ms-access

我正在使用MS Access 2010。

我有一个项目表,每个项目都有一个STARTDATE,ENDDATE和一个True / False字段用于ACTIVE。如果今天的日期在开始日期和结束日期之内,则活动为真 - 我希望自动选中或取消选中它。

如何在VBA中编写此事件?

谢谢!

3 个答案:

答案 0 :(得分:1)

我不明白为什么你的表需要一个Active字段。根据您的描述,如果当前日期在该日期范围内,则为True,否则为False。所以这可以通过查询来完成。

SELECT
    STARTDATE,
    ENDDATE,
    IIf(Date() >= STARTDATE AND Date() <= ENDDATE,
        True, False) AS Active
FROM YourTable;

编辑:但是,如果您确实希望将Active存储为表中的字段,则可以在UPDATE查询中包含该IIf()表达式:

UPDATE YourTable
SET YourTable.Active =  IIf(Date() >= [STARTDATE]
    AND Date() <= [ENDDATE],
    True, False);

答案 1 :(得分:1)

在我看来,如果某行的有效状态完全取决于有效日期,那么该表不应具有有效列

首先,删除表格中的“活动”列。创建一个新查询:

SELECT
   *,
   Now() >= StartDate And Now() < EndDate AS Active
FROM YourTable

现在在您当前使用该表的每个位置使用此查询。如果您遇到性能问题,请将WHERE Active = True替换为上述条件WHERE Now() >= StartDate And Now() < EndDate

一些注意事项:

定义一个VB函数并不是一个好主意,因为这会产生一系列复杂性,这肯定会损害性能而没有真正令人信服的理由。

尝试保持表同步不是一个好主意,因为您最终会遇到竞争条件,更新失败或导致错误数据的不一致。

如果您坚持保留列并尝试同步这些值,那么您将在startdate和enddate文本框的AfterUpdate事件以及Form Current上放置一些代码,以根据当前时间。这还需要一些频繁的工作,根据当前时间进度将表中的所有行更新为“活动”或“非活动”。如果你很幸运,你可能没有太多问题。

答案 2 :(得分:0)

在vba中,您可以使用Date.Now获取当前日期。 如果要构建查询,可以简单地将其作为where子句:

WHERE Now between STARTDATE and ENDDATE

如果您在vba代码中执行此操作,例如在循环中,您可以使用类似

的内容
if Date.Now > STARTDATE and Date.Now < ENDDATE Then
 ...
end if