MS Access 过滤并显示选定时间段的数据

Posted

技术标签:

【中文标题】MS Access 过滤并显示选定时间段的数据【英文标题】:MS Access filter and show data from selected time period 【发布时间】:2021-12-21 01:02:37 【问题描述】:

我有一张表,我在其中输入了机器出现故障的时间。示例:

id Machine Start date End date Number of days
1 3 10.02.2020 17.02.2020 07
2 1 03.04.2020 09.04.2020 06
3 2 25.10.2020 06.11.2020 12
4 3 28.11.2020 10.12.2020 12

机器编号对应于适当机器表中的 ID。

首先,我希望有一个查询或表单,我将从组合框中选择一台机器和时间段(日期选择器或键入它),它会返回该机器在此期间出现故障的天数。

因此,如果我选择 ID 为 3 且时间段从 01.01.2020 到 31.12.2020 的机器,它将显示 19 天。例如,如果我选择 ID 为 2 且时间段从 01.11.2020 到 30.11.2020 的机器,它将返回 6 天,依此类推。

您将如何在 Access 中解决此问题?我是 Access 和 VBA 的新手。

【问题讨论】:

我认为您的意思是机器 2 将显示 11 天,或者您的意思是机器 1 将显示 6 天。不是 ID 值,而是机器值。 感谢您的评论和回答,我会试一试。我的意思是机器 2,因为它在选定的时间段内仅 6 天(从 01.11.2020 到 06.11.2020)出现故障。如果我选择 25.10.2020 之前的时间段,则为 11 天。 答案中的建议将检索日期范围内的记录并对天数值求和。它不会针对部分重叠进行调整。那将需要更复杂的代码。机器 2 记录不符合条件,表达式返回 0。我删除了答案,因为它不满足要求。 机器 2(记录 3)有 12 天。这些天数计数都不包括范围的第一天(或最后一天,无论您想查看哪种方式)。这就是你想要的吗? 查看修改后的答案。 【参考方案1】:

这是产生所需输出的一种方法。将函数放在通用模块中。

Function GetDaysDown(dteStart As Date, dteEnd As Date, intMac As Integer)
Dim rs As DAO.Recordset, intDays As Integer, dteDate As Date
Set rs = CurrentDb.OpenRecordset("SELECT StartDate, EndDate FROM Data WHERE Machine = " & intMac & _
                                 " AND (StartDate BETWEEN #" & dteStart & "# AND #" & dteEnd & _
                                 " # OR EndDate BETWEEN #" & dteStart & "# AND #" & dteEnd & "#)")
Do While Not rs.EOF
    dteDate = rs!startDate
    Do While dteDate < rs!EndDate And dteDate < dteEnd
        If dteDate >= dteStart And dteDate <= dteEnd Then
            intDays = intDays + 1
            'Debug.Print dteDate
        End If
        dteDate = dteDate + 1
    Loop
    rs.MoveNext
Loop
GetDaysDown = intDays
End Function

从文本框调用函数,例如: =GetDaysDown([tbxStart], [tbxEnd], [cbxMac])

有关使用国际日期格式的更多信息,请查看http://allenbrowne.com/ser-36.html

【讨论】:

这可能是德国环境,其中日期必须作为格式化字符串表达式传递:[Start Date] &gt;= #" &amp; Format([tbxStart], "yyyy\/mm\/dd") &amp; "# 感谢您迄今为止的所有帮助。我正在尝试在文本框中运行该函数,但它返回#NAME?。我的字段名称似乎是正确的,表单源是正确的表。有什么想法吗? 你有没有把函数放在一个不同于函数的通用模块中?他们不能有相同的名字。还是表单背后的功能? 当我今天运行它时,该函数似乎在运行,但我收到运行时错误 3075 - 查询表达式中的日期语法错误“机器 = 110 AND (StartDate BETWEEN #01.11.2021# AND #11.11. 2021# OR EndDate BETWEEN #01.11.2021# AND #11.11.2021#”。这与日期格式有关吗? 可能。你为什么使用句号而不是斜线?您是否尝试过 Gustav 的建议并查看 Allen Browne 的文章?

以上是关于MS Access 过滤并显示选定时间段的数据的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 和 ODBC。过滤器对话框不显示

表单过滤器之间的 MS-Access

MS.Access - 在 DoCmd.OpenReport [where 条件] 中使用 2 个过滤条件从表单打印报表

MS Access - 使用子表单过滤时禁止保存提示

MS ACCESS 过滤器组合框所有选项

即使没有结果,如何在分组的 MS Access 报告中显示类别