MS Access中如何按选定时间段筛选并统计对应机器的故障天数
实现步骤
以下是适合Access新手的分步操作,无需复杂基础即可完成:
1. 提前确认表结构(避免后续计算错误)
你需要确保两张表的字段类型符合要求:
- 故障记录表(建议命名为
tbl_Downtime):Machine字段为数字型,关联机器表的主键IDStart date、End date字段为日期/时间型,不要用文本类型存储
- 机器表(建议命名为
tbl_Machine):- 主键为
ID(数字型,和故障表的Machine字段对应),可加MachineName字段存储机器名称,方便下拉选择
- 主键为
2. 核心:编写重叠天数计算查询
故障记录可能跨你选择的查询时间段,不能直接累加Number of days字段,需要先计算单条故障和查询时间段的重叠天数,再汇总,查询SQL如下:
SELECT Sum(DateDiff("d", IIf([Start date]>[Forms]![frm_CalculateDowntime]![txt_StartDate],[Start date],[Forms]![frm_CalculateDowntime]![txt_StartDate]), IIf([End date]<[Forms]![frm_CalculateDowntime]![txt_EndDate],[End date],[Forms]![frm_CalculateDowntime]![txt_EndDate]))+1) AS TotalDowntime FROM tbl_Downtime WHERE [Machine] = [Forms]![frm_CalculateDowntime]![cbo_Machine] AND [Start date] <= [Forms]![frm_CalculateDowntime]![txt_EndDate] AND [End date] >= [Forms]![frm_CalculateDowntime]![txt_StartDate];
将该查询保存为qry_CalculateTotalDowntime即可。
3. 创建交互窗体(无需手动输入参数)
3.1 添加窗体控件
新建空白窗体,命名为frm_CalculateDowntime,添加以下控件:
- 组合框(名称:
cbo_Machine):行源绑定tbl_Machine,设置「列数」为2,「绑定列」为1,「列宽」设为0cm;10cm,即可实现显示机器名称、实际取值为机器ID的效果 - 两个文本框(名称分别为
txt_StartDate、txt_EndDate):格式设置为「短日期」,Access会自动弹出日期选择器 - 命令按钮(名称:
btn_Calculate,标题:计算总停机天数) - 文本框(名称:
txt_Result,设置「是否锁定」为是,用来显示最终结果)
3.2 添加按钮点击VBA代码
右键点击命令按钮,选择「事件生成器-代码生成器」,粘贴以下代码即可:
Private Sub btn_Calculate_Click() ' 先校验必填项是否为空 If IsNull(Me.cbo_Machine) Or IsNull(Me.txt_StartDate) Or IsNull(Me.txt_EndDate) Then MsgBox "请先选择机器、填写完整的查询起止日期" Exit Sub End If If Me.txt_StartDate > Me.txt_EndDate Then MsgBox "开始日期不能晚于结束日期" Exit Sub End If ' 执行查询获取结果 Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("qry_CalculateTotalDowntime") ' 无故障记录返回0,否则返回计算结果 If IsNull(rs!TotalDowntime) Then Me.txt_Result = 0 Else Me.txt_Result = rs!TotalDowntime End If rs.Close Set rs = Nothing End Sub
4. 测试验证
打开窗体,选择对应机器、输入你给出的示例时间段:
- 选ID为3的机器、时间段2020-01-01到2020-12-31,返回结果应为19天
- 选ID为2的机器、时间段2020-11-01到2020-11-30,返回结果应为6天
注意事项
- 如果你的故障记录不存在跨查询时间段的情况,也可以直接累加
Number of days字段,把查询里的Sum部分替换为Sum([Number of days])即可 - 可以给故障表加数据验证规则,确保
End date >= Start date,避免计算出负数天数
内容的提问来源于stack exchange,提问作者Esszed
相关产品推荐
相关产品推荐

