使用GetDate与Distinct时遇无效列名错误,求WHERE子句解决方案
解决SQL无效列名错误的方法
你的错误核心是**TodayDate是SELECT子句中定义的别名,不能在ON/WHERE这类逻辑判断子句中使用**,而且你写的t.TodayDate本身就不对——TodayDate不是表t的原生列,是你计算出来的别名。另外你原来的查询没把需要的JOBNAME和ENDTIME放到SELECT里,得补上。
下面给你几种可行的修改方案:
方案1:直接重复计算表达式
把ON子句里的t.TodayDate替换成你计算当前日期的原表达式,这是最直接的方式:
SELECT DISTINCT CONVERT(varchar, GETDATE(), 112) AS TodayDate, tm.JOBNAME, tm.ENDTIME FROM [LIB_KHP_RTP].[sap].[TBTCO] t INNER JOIN ( SELECT [JOBNAME], [ENDTIME], [STRTDATE] FROM [LIB_KHP_RTP].[sap].[TBTCO] ) tm ON t.[JOBNAME] = tm.[JOBNAME] AND CONVERT(varchar, GETDATE(), 112) = tm.[STRTDATE]
方案2:用变量提前存储当前日期
如果表达式比较复杂,不想重复写,可以先把当前日期存到变量里,再在查询中使用:
DECLARE @TodayDate varchar(8) = CONVERT(varchar, GETDATE(), 112) SELECT DISTINCT @TodayDate AS TodayDate, tm.JOBNAME, tm.ENDTIME FROM [LIB_KHP_RTP].[sap].[TBTCO] t INNER JOIN ( SELECT [JOBNAME], [ENDTIME], [STRTDATE] FROM [LIB_KHP_RTP].[sap].[TBTCO] ) tm ON t.[JOBNAME] = tm.[JOBNAME] AND @TodayDate = tm.[STRTDATE]
方案3:简化查询逻辑(推荐)
你原来的查询是同表自连接,其实完全没必要,直接用WHERE条件过滤STRTDATE等于当前日期即可,效率更高:
DECLARE @TodayDate varchar(8) = CONVERT(varchar, GETDATE(), 112) SELECT DISTINCT @TodayDate AS TodayDate, t.JOBNAME, t.ENDTIME FROM [LIB_KHP_RTP].[sap].[TBTCO] t WHERE t.STRTDATE = @TodayDate
内容的提问来源于stack exchange,提问作者nooby
相关产品推荐
相关产品推荐

