VB.NET环境下SQL查询中DATE_ADD函数使用报错问题求助
问题排查
- 函数适配错误:你参考的是MySQL的
DATE_ADD函数语法,但代码中FVMASTER..trackinghistory的双点表名格式是SQL Server的语法特征,SQL Server对应的日期增减函数为DATEADD,语法为DATEADD(时间单位, 偏移量, 基准日期),和MySQL用法完全不同,这是运行失败的核心原因。 - SQL语法错误:WHERE子句中不能出现
date_added =这类赋值逻辑,WHERE仅支持条件判断表达式,同时你将函数逻辑直接拼接在字符串引号中间,没有做正确的语法连接,直接导致语句结构失效。 - 隐含风险:直接拼接SQL字符串存在SQL注入风险,同时日期类型直接转字符串拼接极易出现时区、格式匹配错误,引发额外的运行异常。
可行实现方案
如果你需要筛选th.DateTime大于「周起始日期往前推4天」的记录,推荐优先用参数化查询实现,避免兼容性问题:
' 提前在VB侧计算好目标过滤日期 Dim targetFilterDate As DateTime = DateAdd(DateInterval.Day, -4, dtimeStartDate) ' 构造参数化SQL语句 Dim querySql As String = " SELECT th.Thickness, odo.OptionCode FROM FVMASTER..trackinghistory th JOIN FVMASTER..OrderDetailOptions odo ON odo.odKey = th.odKey JOIN FVMASTER..MasterPartOptions mpo ON mpo.Code = odo.OptionCode AND mpo.[Group] = odo.optiongroup AND mpo.QuestionKey = 'KGLASS' AND OptionType = 5 WHERE th.DateTime > @FilterDate " ' 传入参数执行查询 sql.AddParameter("@FilterDate", targetFilterDate) sql.runquery(querySql)
如果你需要在SQL侧完成日期计算,使用SQL Server原生DATEADD函数即可:
Dim querySql As String = " SELECT th.Thickness, odo.OptionCode FROM FVMASTER..trackinghistory th JOIN FVMASTER..OrderDetailOptions odo ON odo.odKey = th.odKey JOIN FVMASTER..MasterPartOptions mpo ON mpo.Code = odo.OptionCode AND mpo.[Group] = odo.optiongroup AND mpo.QuestionKey = 'KGLASS' AND OptionType = 5 WHERE th.DateTime > DATEADD(DAY, -4, @StartDate) " sql.AddParameter("@StartDate", dtimeStartDate) sql.runquery(querySql)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

