You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web Forms项目Datetime列时间范围查询无结果问题

解决ASP.NET Web Forms中Datetime时间范围查询无结果的问题

问题根源分析

你的代码存在三个核心问题导致查询无结果:

  1. 参数引用错误:修改后的SQL语句中,@FromTime和@ToTime被单引号包裹('@FromTime'),SQL Server会将其视为普通字符串字面量,而非你传入的参数值,导致查询条件完全不符合预期。
  2. 语法错误(原代码):最初的SQL语句存在连续的and and,属于语法错误,会直接导致查询执行失败。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:01:36