Tsql T-SQL将where子句应用于不工作的函数字段

Tsql T-SQL将where子句应用于不工作的函数字段,tsql,Tsql,我很难按CreateDate筛选此视图。表中的CreateDate格式如下:2013-10-14 15:53:33.900 我设法将年、月、日分为不同的列,但现在不允许在新创建的列上使用我的WHERE子句。具体来说,两行的错误都是“无效列名CreateYear”。伙计们,我做错了什么?有没有比解析日期、月份和年份更好/更简单的方法?这似乎太过分了。我花了很多时间在这上面,但都没有用 SELECT convert(varchar, DATEPART(month,v.CreateDate)) Cre

我很难按CreateDate筛选此视图。表中的CreateDate格式如下:2013-10-14 15:53:33.900

我设法将年、月、日分为不同的列,但现在不允许在新创建的列上使用我的
WHERE
子句。具体来说,两行的错误都是“无效列名CreateYear”。伙计们,我做错了什么?有没有比解析日期、月份和年份更好/更简单的方法?这似乎太过分了。我花了很多时间在这上面,但都没有用

SELECT convert(varchar, DATEPART(month,v.CreateDate)) CreateMonth, 
       convert(varchar, DATEPART(DAY,v.CreateDate)) CreateDay, 
       convert(varchar, DATEPART(YEAR,v.CreateDate)) CreateYear, 
       v.CreateDate, 
       v.customerName 

From 
   vw_Name_SQL_DailyPartsUsage v  

full outer join 
   ABC.serviceteamstechnicians t on v.TechnicianNumber = t.AgentNumber 

full outer join 
   ABC.ServiceTeams s on t.STID = s.STID

 where 
    CreateYear >= '02/01/2018' 
 and 
    CreateYear <= '02/20/2018'
选择convert(varchar,DATEPART(month,v.CreateDate))CreateMonth,
转换(varchar,DATEPART(DAY,v.CreateDate))CreateDay,
转换(varchar,DATEPART(YEAR,v.CreateDate))CreateYear,
v、 CreateDate,
v、 客户名称
从…起
vw\u名称\u SQL\u日常部件第五页
完全外接
ABC.serviceteamstechnicians t on v.TechniciansNumber=t.AgentNumber
完全外接
ABC.s在t.STID上=s.STID
哪里
CreateYear>=“2018年1月2日”
及
CreateYear您可以使用:

SELECT convert(varchar, DATEPART(month,v.CreateDate)) CreateMonth, 
       convert(varchar, DATEPART(DAY,v.CreateDate)) CreateDay, 
       convert(varchar, DATEPART(YEAR,v.CreateDate)) CreateYear, 
       v.CreateDate, 
       v.customerName 
From  vw_Name_SQL_DailyPartsUsage v  
full outer join 
   ABC.serviceteamstechnicians t on v.TechnicianNumber = t.AgentNumber 
full outer join 
   ABC.ServiceTeams s on t.STID = s.STID
where CreateDate BETWEEN '20180102' and  '20180220';

有关逻辑查询处理的更多信息是,如果不使用子查询/交叉应用,则不能在
WHERE
子句中的
SELECT
处引用列别名。

不能在WHERE中的SELECT中引用别名

即使你可以,为什么你希望今年是'2018年1月2日'

你为什么要转换成varchar

where year(v.CreateDate) = 2018 

选择crdate、cast(crdate为日期)、年(crdate)、月(crdate)、日(crdate)
来自sysObjects
铸造位置(crdate as date)='2000-2-10'
按日期订购

你是说YYYYMMDD正确吗?我刚刚尝试过,但它仍然返回相同的错误值PSA:。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,
tsql
缩小了选择范围,但没有指定数据库。
select crdate, cast(crdate as date), year(crdate), month(crdate), day(crdate)   
from sysObjects 
where cast(crdate as date) <= '2014-2-20'
  and cast(crdate as date) >= '2000-2-10' 
order by crdate