MVC日期区间数据查询异常:选明日日期仅返回今日数据求助
解决日期范围查询仅返回部分数据的问题
咱们先梳理下你遇到的核心问题:当选择结束日期为明日时,只能获取今日的数据。这主要是因为后台用DateTime类型处理日期参数时,默认会带上00:00:00的时间部分,导致查询范围没有覆盖到结束日期当天的所有数据;另外你原来的代码还存在SQL注入风险,这也得一起修正。
结合你的数据库仅存储日期(非DateTime)的情况,给你几个可行的解决方案:
方案1:调整结束日期范围,用>=和<替代BETWEEN
BETWEEN是包含两端的,但如果我们把结束日期往后推一天(变为次日凌晨),再用>= 起始日期和< 调整后的结束日期,就能完美覆盖结束日期当天的所有数据,同时还能避免时间部分的干扰。另外必须改用参数化查询防止SQL注入:
private static DataTable getData(string table, DateTime startDate, DateTime endDate) { string constr = ConfigurationManager.ConnectionStrings["db_Demo"].ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { // 把结束日期调整为次日凌晨,确保包含endDate当天的所有数据 DateTime adjustedEndDate = endDate.AddDays(1); using (SqlCommand cmd = new SqlCommand(@"SELECT * FROM Table1 WHERE Entry_Datetime >= @StartDate AND Entry_Datetime < @AdjustedEndDate")) { using (SqlDataAdapter da = new SqlDataAdapter()) { DataTable dt = new DataTable(); cmd.CommandType = CommandType.Text; cmd.Connection = con; // 添加参数,避免SQL注入,同时只取日期部分 cmd.Parameters.AddWithValue("@StartDate", startDate.Date); cmd.Parameters.AddWithValue("@AdjustedEndDate", adjustedEndDate.Date); da.SelectCommand = cmd; da.Fill(dt); return dt; } } } }
方案2:直接适配Date类型(数据库确认为Date类型时用)
如果数据库里的Entry_Datetime是严格的Date类型(仅存年月日),可以直接将参数转换为Date类型,确保查询范围完全匹配:
private static DataTable getData(string table, DateTime startDate, DateTime endDate) { string constr = ConfigurationManager.ConnectionStrings["db_Demo"].ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { using (SqlCommand cmd = new SqlCommand(@"SELECT * FROM Table1 WHERE Entry_Datetime BETWEEN @StartDate AND @EndDate")) { using (SqlDataAdapter da = new SqlDataAdapter()) { DataTable dt = new DataTable(); cmd.CommandType = CommandType.Text; cmd.Connection = con; // 仅保留日期部分,忽略时间 cmd.Parameters.AddWithValue("@StartDate", startDate.Date); cmd.Parameters.AddWithValue("@EndDate", endDate.Date); da.SelectCommand = cmd; da.Fill(dt); return dt; } } } }
额外小提示:确保视图日期参数解析准确
你的视图已经用了type="date",能让浏览器生成标准的日期选择器,提交的格式是yyyy-MM-dd,一般不会有问题。如果后台偶尔出现解析错误,可以在接收参数时指定格式:
// 在控制器中接收参数时的示例 DateTime startDate = DateTime.ParseExact(Request["startDate"], "yyyy-MM-dd", CultureInfo.InvariantCulture); DateTime endDate = DateTime.ParseExact(Request["endDate"], "yyyy-MM-dd", CultureInfo.InvariantCulture);
重要提醒:一定要避免SQL注入
你原来的代码直接把日期字符串拼接进SQL语句,这是非常危险的操作,很容易被攻击者利用进行SQL注入。上面的方案都使用了参数化查询,这是保护数据库安全的必要手段,一定要坚持使用。
内容的提问来源于stack exchange,提问作者Usman Azam
相关产品推荐
相关产品推荐

