SQL别名提供无效的列名

时间:2011-11-23 13:48:58

标签: sql sql-server sql-server-2005

使用以下SQL表达式但我收到错误。

select
  CampaignCustomer.CampaignCustomerID,
  convert(varchar, CampaignCustomer.ModifiedDate, 111) as startdate,
  CampaignCustomer.CampaignID,
  CampaignCustomer.CampaignCallStatusID,
  CampaignCustomer.UserID,
  CampaignCustomerSale.Value,
  Users.Name
from CampaignCustomer
  inner join CampaignCustomerSale
    on CampaignCustomer.CampaignCustomerID = CampaignCustomerSale.CampaignCustomerID
  inner join Users
    on CampaignCustomer.UserID = Users.UserID
where
  CampaignCustomer.CampaignCallStatusID = 21
  and CampaignCustomer.startdate = '2011/11/22'      <------- THIS
order by
  startdate desc,
  Users.Name asc

错误:

  

Msg 207,Level 16,State 1,Line 1
  列名称'startdate'无效。

我无法在WHERE子句中识别我的别名startdate,但它可以在我的ORDER BY子句中。怎么了?

修改
不,我不可能将数据类型更改为date而不是datetime。其他地方需要时间。但在这种情况下,我只需要在特定日期获取所有帖子,而我真的不关心modifieddate的日期时间:)

可能需要另一种方法而不是convert()?

3 个答案:

答案 0 :(得分:10)

您不能在WHERE子句中使用列别名。


将其更改为:

where
  CampaignCustomer.CampaignCallStatusID = 21
  and convert(varchar, CampaignCustomer.ModifiedDate, 111) = '2011/11/22' 

答案 1 :(得分:4)

这样做:

select 
  CampaignCustomer.CampaignCustomerID, 
  convert(varchar, CampaignCustomer.ModifiedDate, 111) as startdate, 
  CampaignCustomer.CampaignID, 
  CampaignCustomer.CampaignCallStatusID, 
  CampaignCustomer.UserID, 
  CampaignCustomerSale.Value, 
  Users.Name 
from CampaignCustomer 
  inner join CampaignCustomerSale 
    on CampaignCustomer.CampaignCustomerID = CampaignCustomerSale.CampaignCustomerID 
  inner join Users 
    on CampaignCustomer.UserID = Users.UserID 
where 
  CampaignCustomer.CampaignCallStatusID = 21 
  and convert(varchar, CampaignCustomer.ModifiedDate, 111) = '2011/11/22'
order by 
  startdate desc, 
  Users.Name asc 

您需要在where子句中添加别名,在上面的查询中,我将别名替换为它所代表的内容。

答案 2 :(得分:1)

您没有提到您正在使用的SQL Server的版本 - 但如果您使用的是2008或更新版本,则可以使用:

where
  CampaignCustomer.CampaignCallStatusID = 21
  and CAST(CampaignCustomer.ModifiedDate AS DATE) = '20111122'

您可以将其投放到DATE - 仅用于此比较。

另外:如果您需要将日期与字符串进行比较,我建议始终使用表示日期的ISO-8601标准格式 - ISO-8601将日期定义为YYYYMMDD并且是SQL Server中唯一始终有效的格式 - 无论您使用何种语言/区域设置。日期的任何其他字符串表示始终受SQL Server中的设置限制 - 它可能适合您,但我打赌别人,它会破坏....