如何在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 @EndDateTimedatetime类型字段,这样查询效率更高哦~
内容的提问来源于stack exchange,提问作者Ricardo Sampaio
相关产品推荐
相关产品推荐

