使用以下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()?
答案 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中的设置限制 - 它可能适合您,但我打赌别人,它会破坏....