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

如何通过文本框搜索功能返回日期列中空值与指定范围的所有记录

解决方法

核心逻辑调整说明

SQL中NULL值和任意值进行大小比较、等于比较的结果都为UNKNOWN,不会被WHERE条件筛选出来,必须单独使用IS NULL判断匹配空值。同时注意逻辑运算优先级:AND优先级高于OR,所以必须把原来的日期范围条件用括号包裹,避免逻辑错误。

1. 修改SQL查询语句

首先修正你原有代码中的三处错误:

  • 表别名错误:语句中的b.[Created_DateTime]需改为v.[Created_DateTime]
  • 变量名错误:拼接SQL时用的DateStart、DateEnd和方法入参DateS、DateE不匹配
  • SELECT字段缺失:需要查询Created_DateTime字段才能在前端展示创建日期

修改后的查询逻辑如下,同时建议直接替换为参数化查询,避免SQL注入风险和日期格式兼容问题:

protected int DoItemList(SqlConnection connection, StringBuilder sb, string DateS, string DateE, string filter)
{
    string sql = "";
    SqlCommand readCommand = null;
    SqlDataReader reader = null;
    int count = 0;

    try
    {
        string itemFilter = DoFilter(filter);
        // 新增IS NULL判断,用括号包裹原有日期范围条件
        sql = @"SELECT v.[Code], v.[Created_DateTime] 
                FROM [CAS].[dbo].[Van] v 
                WHERE (v.[Created_DateTime] >= @DateStart AND v.[Created_DateTime] <= @DateEnd) 
                OR v.[Created_DateTime] IS NULL";

        readCommand = new SqlCommand(sql, connection);
        // 参数化传值,自动处理日期格式转换
        readCommand.Parameters.AddWithValue("@DateStart", DateTime.ParseExact(DateS, "MM-dd-yyyy", System.Globalization.CultureInfo.InvariantCulture));
        readCommand.Parameters.AddWithValue("@DateEnd", DateTime.ParseExact(DateE, "MM-dd-yyyy", System.Globalization.CultureInfo.InvariantCulture));
        reader = readCommand.ExecuteReader();

        while (reader.Read())
        {
            count++;
            AddRowItem(sb, reader, count);
        }

        reader.Close(); 
    }
    catch (Exception e)
    {
       // 建议补充异常日志输出
    }
    return count;
}

2. 修复空值转换方法

原有ConvertDate方法没有处理数据库NULL值(对应C#的DBNull类型),会导致空值时报错,修改如下:

private string ConvertDate(Object obj)
{
    // 处理数据库空值
    if (obj == DBNull.Value)
    {
        return "null"; // 可根据需求改为空字符串等其他展示值
    }
    if (obj is DateTime dt)
    {
         return dt.ToString("yyyy-MM-dd"); // 可调整为你需要的日期展示格式
    }
    else
    {
        return obj?.ToString() ?? "";
    }
}

3. 调整行拼接逻辑

适配新增的创建日期字段,修改AddRowItem方法:

protected void AddRowItem(StringBuilder sb, SqlDataReader reader, int index)
{
    sb.Append("<tr>");
    sb.Append("<td>").Append(reader["Code"].ToString()).Append("</td>");
    sb.Append("<td>").Append(ConvertDate(reader["Created_DateTime"])).Append("</td>");
    sb.Append("</tr>");
}  

内容的提问来源于stack exchange,提问作者MushroomT A.C.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:57:03