如何修改MS Access查询以统计当前日期前两周内降雨记录>0的次数?
问题修正:统计两周内降雨记录次数的SQL查询调整
问题根源
原查询仅返回当日统计结果的核心原因:日期范围逻辑错误。你在构建start_date和end_date时,错误地将表单输入的年份与当前记录的月日拼接,导致每条记录的日期范围都是独立且与自身记录日期不匹配的区间(比如2023-07-01的记录,对应的区间是2024-06-17至2024-07-01),最终只有年份匹配且日期恰好等于区间结束日的记录才会被筛选出来。
修改后的查询方案
根据你的需求(统计当前日期前两周内Meteo_Rain,mm/hr>0的每日记录次数),以下是修正后的SQL语句:
方案1:基于系统当前日期的前两周统计
SELECT -- 统一转换记录日期并设置别名,简化后续引用 DateSerial(Val(VEC_data.[Date&Time_YYYY]), Val(VEC_data.[Date&Time_mm]), Val(VEC_data.[Date&Time_DD])) AS RecordDate, COUNT(VEC_data.[Meteo_Rain,mm/hr]) AS RainyRecordCount FROM VEC_data WHERE -- 筛选记录日期落在当前日期前14天至当天的区间内 DateSerial(Val(VEC_data.[Date&Time_YYYY]), Val(VEC_data.[Date&Time_mm]), Val(VEC_data.[Date&Time_DD])) BETWEEN DateAdd("d", -14, Date()) AND Date() -- 仅统计降雨量大于0的记录 AND Val(VEC_data.[Meteo_Rain,mm/hr]) > 0 GROUP BY DateSerial(Val(VEC_data.[Date&Time_YYYY]), Val(VEC_data.[Date&Time_mm]), Val(VEC_data.[Date&Time_DD])) ORDER BY RecordDate;
方案2:基于表单指定年份的特定日期前两周统计
如果需要统计表单输入年份中某个指定日期的前两周(假设表单新增enter_month和enter_day控件用于指定结束日期),可以使用以下语句:
SELECT DateSerial(Val(VEC_data.[Date&Time_YYYY]), Val(VEC_data.[Date&Time_mm]), Val(VEC_data.[Date&Time_DD])) AS RecordDate, COUNT(VEC_data.[Meteo_Rain,mm/hr]) AS RainyRecordCount FROM VEC_data WHERE -- 构建表单指定的固定结束日期,再计算前14天的起始日期 DateSerial(Val(VEC_data.[Date&Time_YYYY]), Val(VEC_data.[Date&Time_mm]), Val(VEC_data.[Date&Time_DD])) BETWEEN DateAdd("d", -14, DateSerial(Forms!graph_input!enter_year, Forms!graph_input!enter_month, Forms!graph_input!enter_day)) AND DateSerial(Forms!graph_input!enter_year, Forms!graph_input!enter_month, Forms!graph_input!enter_day) AND Val(VEC_data.[Meteo_Rain,mm/hr]) > 0 GROUP BY DateSerial(Val(VEC_data.[Date&Time_YYYY]), Val(VEC_data.[Date&Time_mm]), Val(VEC_data.[Date&Time_DD])) ORDER BY RecordDate;
关键调整说明
- 固定日期区间:将原本依赖记录月日的动态区间,改为基于系统当前日期或表单指定日期的固定两周区间,确保所有符合条件的记录都能被纳入统计。
- 简化别名:将重复的日期转换逻辑设置为
RecordDate别名,提升查询可读性和维护性。
内容的提问来源于stack exchange,提问作者ViktorAlexiev
相关产品推荐
相关产品推荐

