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] >= #" & Format([tbxStart], "yyyy\/mm\/dd") & "#
。
感谢您迄今为止的所有帮助。我正在尝试在文本框中运行该函数,但它返回#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 - 在 DoCmd.OpenReport [where 条件] 中使用 2 个过滤条件从表单打印报表