MS Access 按指定ModelLog统计当前/上一小时匹配数据行数的查询写法
MS Access 时间区间匹配统计查询实现
核心查询逻辑说明
两个统计需求均可通过半开半闭区间判断实现,避免整点边界值的统计遗漏或重复计算,且兼容OleDb连接Access的参数传值规则。
1. 统计当前系统小时内的数据行数
先计算当前小时的时间边界:
- 区间起点:当前系统时间截断到小时整,即保留年、月、日、当前小时数,分钟、秒、毫秒全部置0
- 区间终点:上述起点加1小时
对应C#实现代码:
// 计算时间边界 DateTime currentHourStart = new DateTime( DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0 ); DateTime currentHourEnd = currentHourStart.AddHours(1); // 执行统计查询 string countSql = @" SELECT COUNT(*) FROM timer WHERE DateTimeLog >= @startTime AND DateTimeLog < @endTime "; OleDbCommand countCmd = new OleDbCommand(countSql, connection); countCmd.Parameters.Add("@startTime", OleDbType.DBTimeStamp).Value = currentHourStart; countCmd.Parameters.Add("@endTime", OleDbType.DBTimeStamp).Value = currentHourEnd; int rowCount = Convert.ToInt32(countCmd.ExecuteScalar());
2. 统计上一小时区间内匹配指定ModelLog值的总行数
上一小时的时间边界计算逻辑:
- 区间起点:当前小时起点往前推1小时的整点值
- 区间终点:当前小时的整点值(和上述当前小时起点一致)
- 匹配条件:叠加
ModelLog字段等于指定值的过滤规则
对应C#实现代码:
DateTime lastHourStart = currentHourStart.AddHours(-1); string targetModel = mlb.Text; // 替换为实际需要匹配的ModelLog值 string modelCountSql = @" SELECT COUNT(*) FROM timer WHERE DateTimeLog >= @startTime AND DateTimeLog < @endTime AND ModelLog = @modelValue "; OleDbCommand modelCountCmd = new OleDbCommand(modelCountSql, connection); modelCountCmd.Parameters.Add("@startTime", OleDbType.DBTimeStamp).Value = lastHourStart; modelCountCmd.Parameters.Add("@endTime", OleDbType.DBTimeStamp).Value = currentHourStart; modelCountCmd.Parameters.Add("@modelValue", OleDbType.VarChar).Value = targetModel; int lastHourModelRowCount = Convert.ToInt32(modelCountCmd.ExecuteScalar());
注意事项
- 现有插入代码中
DateTime.Now.ToString("g")再重新Parse为日期的步骤属于冗余操作,直接将DateTime.Now赋值给日期类型参数即可,可避免因系统区域格式差异导致的日期解析错误 - 不要使用
Between做时间区间判断,否则整点时刻刚好等于区间终点的日志记录会被重复统计 - 若不依赖C#传参直接写纯Access SQL,可使用
DateSerial、DateAdd、Hour内置函数计算时间边界,但传参方式的执行效率更高,也不受数据库区域设置影响 - OleDb连接MS Access时不存在命名参数匹配机制,所有参数严格按照SQL语句中出现的先后顺序赋值,顺序错误会直接导致查询逻辑失效
内容的提问来源于stack exchange,提问作者Jia Soon Loo
相关产品推荐
相关产品推荐

