SQL Server中LIKE搭配DATEADD查询去年数据返回0的问题排查
错误原因
- 核心问题是你把
DATEADD函数直接写在了单引号包裹的字符串常量里,SQL Server不会解析引号内的函数逻辑,只会把DATEADD(year,-1,GETDATE())当成普通的文本字符串去和rdata字段做匹配——只有rdata里真的存了这一长串函数文本才会命中,正常存日期内容的记录不可能符合条件,因此查询匹配不到任何行,SUM聚合返回NULL,最终被ISNULL转换为0。 - 次要问题:
DATEADD(year,-1,GETDATE())本身返回的是上一年的完整日期时间值(例如2024年执行时返回2023-当前月-当前日 当前时分秒),不是单独的4位年份数字,就算把函数放到引号外,不做年份提取和类型转换也无法得到%2023%这类你需要的匹配格式。
修正后代码
你需要先提取上一年的年份值,转为字符串后再和%通配符拼接,逻辑和你最初硬编码'%2021%'的效果完全一致:
SELECT ISNULL(CONVERT(INT, SUM(fi.qtt)), 0) FROM fi INNER JOIN st ON st.ref = fi.ref WHERE rdata LIKE '%' + CONVERT(VARCHAR(4), YEAR(DATEADD(YEAR, -1, GETDATE()))) + '%'
说明:代码里把原来的逗号隐式表连接改成了显式
INNER JOIN写法,可读性更强,关联逻辑和你原代码完全一致,不会改变查询结果。
内容的提问来源于stack exchange,提问作者questionador
相关产品推荐
相关产品推荐

