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

如何在SqlCommand中使用两个BETWEEN?SQL Server查询语法报错求助

问题分析与解决方案

嘿,我一眼就揪出你代码里的问题啦!你遇到的SQL语法错误,根源就是多写了一个WHERE关键字——这可是SQL语法里的大忌哦~

核心错误拆解

你的原SQL语句里,在第一个WHERE筛选日期范围后,又重复加了一个WHERE来处理时间范围,这完全不符合SQL的语法规则。多个查询条件之间只需要用AND/OR直接连接,不需要重复使用WHERE。

修正后的完整代码

我帮你把错误的SQL语句改好了,还加了一点参数类型的优化建议(比AddWithValue更稳妥):

public void getData() { 
    // 移除多余的WHERE,用AND直接连接时间条件
    SqlCommand SelectSpecificDataTL = new SqlCommand("Select * from cash where Date between @InitialDate and @FinalDate and Time between @InitialTime and @FinalTime", database.cash); 
    database.cash.Open(); 
    // 建议指定参数类型,避免隐式转换带来的问题
    SelectSpecificDataTL.Parameters.Add("@InitialDate", SqlDbType.Date).Value = dateTimePickerIDate.Value.Date; 
    SelectSpecificDataTL.Parameters.Add("@FinalDate", SqlDbType.Date).Value = dateTimePickerFDate.Value.Date; 
    // 如果数据库里的Time字段是time类型,用TimeSpan匹配更准确
    SelectSpecificDataTL.Parameters.Add("@InitialTime", SqlDbType.Time).Value = TimeSpan.Parse(txtInitialTime.Text); 
    SelectSpecificDataTL.Parameters.Add("@FinalTime", SqlDbType.Time).Value = TimeSpan.Parse(txtFinalTime.Text); 
    SqlDataAdapter SpecificData = new SqlDataAdapter(SelectSpecificDataTL); 
    DataTable data = new DataTable(); 
    SpecificData.Fill(data); 
    database.cash.Close(); 
}

额外优化小提示

  • 参数类型更严谨:用Add方法指定SqlDbType,比AddWithValue更不容易出现隐式类型转换的问题,比如日期只取Date部分,时间用TimeSpan匹配SQL的time类型。
  • 跨天场景适配:如果你的业务需要处理跨天的时间段(比如当天23:00到次日01:00),当前的Time BETWEEN逻辑会失效,这时候可以把Date和Time字段组合成完整的DateTime来判断:
    Select * from cash 
    where CONVERT(datetime, Date) + CONVERT(datetime, Time) between @StartDateTime and @EndDateTime
    
    当然,最理想的做法是直接在数据库里存储完整的datetime类型字段,这样查询效率更高哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:34:42