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

T-SQL中DECLARE SET语句查询无结果问题排查求助

问题分析及解决办法

你的查询有两个关键问题导致查不到数据:

  1. @aa变量多套了单引号
    你用concat('''',year(getdate())-67,'''')生成的是带嵌套单引号的字符串(比如实际值为'1957'时,变量存储的是''1957''),但cast(datepart(year,BirthDate) as varchar(50))得到的是不带单引号的年份字符串(比如'1957'),两者内容完全不匹配,自然找不到结果。

  2. 隐式转换导致的年份提取错误
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:49:57