Псевдоним SQL дает неверное имя столбца - PullRequest
4 голосов
/ 23 ноября 2011

Используя следующее выражение 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

Ошибка:

Сообщение 207, Уровень 16, Состояние 1, Строка 1
Неверное имя столбца 'startdate'.

Я не могу распознать мой псевдоним startdate в предложении WHERE, но это возможно в моем предложении ORDER BY. Что не так?

Edit:
И нет, я не могу изменить тип данных на date вместо datetime. Время нужно в другом месте. Но в этом случае мне нужно только получить все сообщения на определенную дату, и меня действительно не волнует, в какое время даты modifieddate: :)

Может быть, нужен другой метод вместо convert ()?

Ответы [ 3 ]

10 голосов
/ 23 ноября 2011

Нельзя использовать псевдоним столбца в предложении WHERE.


Измените его на:

where
  CampaignCustomer.CampaignCallStatusID = 21
  and convert(varchar, CampaignCustomer.ModifiedDate, 111) = '2011/11/22' 
4 голосов
/ 23 ноября 2011

Сделайте следующее:

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 псевдонимы, а в приведенном выше запросе я заменил ваш псевдоним тем, что он представляет.

1 голос
/ 23 ноября 2011

Вы не упомянули, какую версию SQL Server вы используете, но если вы используете 2008 или новее, вы можете использовать:

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

Вы можете привести его к DATE - только для сравнения.

Также: я бы рекомендовал всегда использовать стандартный формат ISO-8601 для представления даты, если вам нужно сравнить дату со строкой - ISO-8601 определяет дату как YYYYMMDD и является единственный формат в SQL Server, который будет работать всегда - независимо от того, какие у вас языковые / региональные настройки. Любое другое строковое представление даты всегда зависит от настроек вашего SQL Server - это может сработать для вас, но я держу пари, что для кого-то другого это сломается ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...