T-SQL中DECLARE SET语句查询无结果问题排查求助
问题分析及解决办法
你的查询有两个关键问题导致查不到数据:
@aa变量多套了单引号
你用concat('''',year(getdate())-67,'''')生成的是带嵌套单引号的字符串(比如实际值为'1957'时,变量存储的是''1957''),但cast(datepart(year,BirthDate) as varchar(50))得到的是不带单引号的年份字符串(比如'1957'),两者内容完全不匹配,自然找不到结果。隐式转换导致的年份提取错误
BirthDate是varchar(50)类型,直接传入datepart函数会触发SQL隐式转换。如果你的日期字符串格式不符合SQL默认规则(比如不是yyyy-MM-dd这类标准格式),转换会失败,datepart返回的要么是NULL,要么是错误的年份值,根本没法匹配。
修正后的查询
直接用整数存储目标年份,避免字符串匹配的麻烦:
declare @aa int set @aa = year(getdate())-67 select * from dimcustomer where year(cast(BirthDate as date)) = @aa
如果必须用字符串类型(不推荐),去掉@aa的单引号即可:
declare @aa varchar(50) set @aa = cast(year(getdate())-67 as varchar(50)) select * from dimcustomer where year(cast(BirthDate as date)) = @aa
额外提醒
- 如果
BirthDate里有格式错误的脏数据,cast(BirthDate as date)会报错,可以用try_cast容错:select * from dimcustomer where year(try_cast(BirthDate as date)) = @aa - 别用字符串存日期!后续建议把
BirthDate改成date或datetime类型,既能避免转换坑,查询性能也会更好。
内容的提问来源于stack exchange,提问作者SQL2023
相关产品推荐
相关产品推荐

