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

如何修复C#中Oracle SQL日期范围查询返回错误结果的问题

问题原因

你查错结果的核心问题有三个:

  • SQL语句里根本没有引用传入的两个查询日期参数,where条件里写死了1900/01/01和9999/12/28的判断,正常业务数据几乎都满足这个条件,等于没有做任何日期范围过滤,自然会返回所有符合死条件的活动记录。
  • 用to_char()把日期字段转成字符串做大小比较,一方面会让日期字段上的索引失效,数据量大时查询性能极差;另一方面如果日期格式配置出错,会直接导致比较逻辑混乱。
  • 参数绑定写法不符合Oracle语法:Oracle官方驱动的参数前缀是冒号:,不是SQL Server用的@,就算你在SQL里写了参数,用@前缀也无法正确识别绑定值。
修改步骤

1. 重写SQL查询语句

去掉无意义的固定日期判断,不要对表中日期字段做函数转换,直接用日期类型做比较,根据业务需求选区间判断逻辑:

// 场景1:要查询【和输入的时间范围有重叠】的活动
SqlStr = @"SELECT 
    ATUL_EFF_DT AS start_date, 
    ATUL_EXP_DT AS end_date, 
    campaign_name 
FROM campaign_table 
WHERE ATUL_EFF_DT <= :query_end
  AND ATUL_EXP_DT >= :query_start";

// 场景2:要查询【完全落在输入时间范围内】的活动(即你问题描述里的预期效果:7.1-7.2的活动因为结束时间超过7.1不会被查出,6.23-6.25的活动会正常返回)
SqlStr = @"SELECT 
    ATUL_EFF_DT AS start_date, 
    ATUL_EXP_DT AS end_date, 
    campaign_name 
FROM campaign_table 
WHERE ATUL_EFF_DT >= :query_start
  AND ATUL_EXP_DT <= :query_end";

字段别名不要带空格,否则查询时需要额外加转义符,容易出不必要的错误。

2. 修正参数绑定逻辑

不要直接把文本框输入的字符串当参数传,先在C#侧做日期格式校验,转成DateTime类型后再绑定,避免隐式转换带来的逻辑错误:

// 先校验输入日期格式是否合法
if (!DateTime.TryParseExact(TextBox1.Text.Trim(), "yyyy/MM/dd", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime queryStart))
{
    // 替换成你的页面提示逻辑:起始日期格式错误,请输入yyyy/MM/dd格式的合法日期
    return;
}
if (!DateTime.TryParseExact(TextBox2.Text.Trim(), "yyyy/MM/dd", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime queryEnd))
{
    // 替换成你的页面提示逻辑:结束日期格式错误,请输入yyyy/MM/dd格式的合法日期
    return;
}
// 处理带时分秒的边界问题:如果库中日期带时分秒,把查询结束时间设为当天23:59:59.999,避免漏掉当天的记录
DateTime queryEndWithTime = queryEnd.Date.AddDays(1).AddMilliseconds(-1);

// 绑定参数,注意前缀用Oracle支持的:,值传转换后的DateTime类型
pO_params.Add(":query_start", queryStart.Date);
pO_params.Add(":query_end", queryEndWithTime);

如果你的campaign_table里的ATUL_EFF_DT和ATUL_EXP_DT字段本身是只存年月日、不带时分秒的DATE类型,可以去掉时分秒补全的逻辑,直接传queryEnd.Date即可。

注意事项
  • 永远不要在WHERE条件里对表字段套用函数(比如之前写的to_char(ATUL_EFF_DT,'yyyy/MM/dd')),这种写法会导致数据库无法使用字段上建的普通索引,数据量到十万级以上查询速度会明显变慢。
  • 做日期比较时一律用日期类型传参、比较,不要转成字符串比大小,不同区域的日期格式、分隔符差异很容易导致比较逻辑出错。

内容的提问来源于stack exchange,提问作者baro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:54:16