ASP.NET Web Forms项目Datetime列时间范围查询无结果问题
解决ASP.NET Web Forms中Datetime时间范围查询无结果的问题
问题根源分析
你的代码存在三个核心问题导致查询无结果:
- 参数引用错误:修改后的SQL语句中,
@FromTime和@ToTime被单引号包裹('@FromTime'),SQL Server会将其视为普通字符串字面量,而非你传入的参数值,导致查询条件完全不符合预期。 - 语法错误(原代码):最初的SQL语句存在连续的
and and,属于语法错误,会直接导致查询执行失败。 - FORMAT函数的性能与可靠性问题:用
FORMAT把时间转为字符串比较,会阻止SQL Server使用datelogged列的索引(拖慢查询速度),还可能因字符串格式匹配问题导致逻辑偏差。
修正方案
方案1:直接比较Time类型(逻辑可靠)
将datelogged的时间部分和传入的时间参数转为time类型直接比较,避免字符串转换的潜在问题:
public DataTable GetDataForSearch(string datelogged, string FromTime, string ToTime, string BranchCode, string OrderType) { DataTable dt = new DataTable(); try { using (SqlCommand cmd = new SqlCommand()) { conn.Open(); cmd.Connection = conn; cmd.CommandText = @"select datelogged AS EntredDatetime, Doc_type AS OrderType, Printer_name, BranchID AS BranchCode, Status, id from Print_Report where BranchID = @BranchCode and CAST(datelogged AS DATE) = @datelogged and Doc_type = @OrderType and CAST(datelogged AS TIME) >= CAST(@FromTime AS TIME) and CAST(datelogged AS TIME) <= CAST(@ToTime AS TIME)"; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 50000; cmd.Parameters.AddWithValue("@datelogged", datelogged); cmd.Parameters.AddWithValue("@FromTime", FromTime); cmd.Parameters.AddWithValue("@ToTime", ToTime); cmd.Parameters.AddWithValue("@BranchCode", BranchCode); cmd.Parameters.AddWithValue("@OrderType", OrderType); SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.Fill(dt); } } catch (Exception ex) { // 可添加日志记录或异常处理逻辑 } finally { conn.Close(); } return dt; }
方案2:拼接完整Datetime范围(性能最优)
如果datelogged列存在索引,推荐此方式,可直接利用索引大幅提升查询性能:
public DataTable GetDataForSearch(string datelogged, string FromTime, string ToTime, string BranchCode, string OrderType) { DataTable dt = new DataTable(); try { using (SqlCommand cmd = new SqlCommand()) { conn.Open(); cmd.Connection = conn; cmd.CommandText = @"select datelogged AS EntredDatetime, Doc_type AS OrderType, Printer_name, BranchID AS BranchCode, Status, id from Print_Report where BranchID = @BranchCode and Doc_type = @OrderType and datelogged >= CAST(@datelogged + ' ' + @FromTime AS DATETIME) and datelogged <= CAST(@datelogged + ' ' + @ToTime AS DATETIME)"; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 50000; cmd.Parameters.AddWithValue("@datelogged", datelogged); cmd.Parameters.AddWithValue("@FromTime", FromTime); cmd.Parameters.AddWithValue("@ToTime", ToTime); cmd.Parameters.AddWithValue("@BranchCode", BranchCode); cmd.Parameters.AddWithValue("@OrderType", OrderType); SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.Fill(dt); } } catch (Exception ex) { // 可添加日志记录或异常处理逻辑 } finally { conn.Close(); } return dt; }
关键修正点说明
- 移除参数的单引号:参数化查询中,参数名无需用单引号包裹,SQL Server会自动处理类型匹配。
- 替换FORMAT函数:改用类型转换直接比较,避免字符串比较的潜在问题,同时提升性能。
- 补充缺失参数:确保SQL中用到的
@BranchCode和@OrderType参数在代码中正确传入并绑定。
内容的提问来源于stack exchange,提问作者ahmed abdelaziz
相关产品推荐
相关产品推荐

