2015-01-05 1 views
0

У меня есть простая таблица, где дата столбец answer_6 (форматированный в varchar(max) либо имеет действительную дату или строку Now. Я хотел бы заменить Now с текущей даты/времени, а затем вычислить разность . Вот что я сделал:SQL заменить с помощью SELECT, и недопустимый столбец

select 
CASE [answer_6] 
    WHEN 'Now' THEN CONVERT(varchar, GETDATE()) 
    ELSE answer_6 
END as x, 
answer_6 from [tDataMult] where DATEDIFF(yy, GETDATE(), [x]) > 5 

система дает мне invalid column name 'x' Если я удалить DateDiffSELECT оператор работает отлично

+1

*** SQL *** - это только * Структурированный язык запросов * - язык, используемый многими системами баз данных, но не продукт базы данных ... многие вещи специфичны для поставщиков, поэтому нам действительно нужно знать, что * * система баз данных ** (и какая версия) вы используете (пожалуйста, обновите теги соответственно) .... –

+0

К сожалению, вы не можете использовать псевдонимы 'select' в своих предложениях' where'; они не признаются. Вы можете дублировать значение в предложении 'where', но, надеюсь, у кого-то есть более элегантное решение. – Jacob

+0

Возможный дубликат [Использование псевдонимов в разделе Where или альтернативный вариант?] (Http://stackoverflow.com/questions/7705470/using-aliases-in-where-clause-or-an-alternative-option) – Jacob

ответ

1

Вы не можете использовать псевдонимы в предложении о са WHERE.. меня уровень, как он был определен как WHERE Статья оценивается до статья SELECT. Попробуйте следующее:

SELECT t.* FROM (<...>) t WHERE DATEDIFF(yy, GETDATE(), [t.x]) > 5 

Вместо <...> поставить запрос без WHERE пункта.

1

Вы не можете ссылаться на псевдоним, который вы только что создали, в предложении WHERE. Самый простой способ исправить это будет просто превратить ваш первоначальный запрос в подзапрос:

SELECT * 
FROM 
(
    select 
    CASE [answer_6] 
    WHEN 'Now' THEN CONVERT(varchar, GETDATE()) 
    ELSE answer_6 
    END as x, 
    answer_6 from [tDataMult] 
) AS qry 
WHERE DATEDIFF(yy, GETDATE(), [x]) > 5 

Или вы могли бы повторить выражение в вашем WHERE пункте:

select 
CASE [answer_6] 
    WHEN 'Now' THEN CONVERT(varchar, GETDATE()) 
    ELSE answer_6 
END as x, 
answer_6 from [tDataMult] 
WHERE DATEDIFF(yy, GETDATE(), 
    (CASE [answer_6] 
    WHEN 'Now' THEN CONVERT(varchar, GETDATE()) 
    ELSE answer_6 
    END) 
) > 5 
+0

Джефф, удивительный, я попробовал первую версию, и это отлично поработало, хотя у меня другая проблема. Моя колонка - varchar (max), которая хранит дату как «mm/yyyy». Теперь я получаю ошибки в DATEDIFF, а именно во время преобразования. Вот что у меня есть: DATEDIFF (год, GETDATE(), CONVERT (datetime, x))> 5 Вышеприведенная ошибка при преобразовании. Есть идеи? Опять же, спасибо за сказанное выше. – user2486157

+0

Ничего, просто узнал, как это сделать. Вот ссылка на те, которые могут понадобиться. Нижеприведенное заявление преобразует mm/yyyy в действительное время и дату: 'code' CAST ((SUBSTRING (answer_6,1,2) + '/ 01' + SUBSTRING (answer_6,3,5)) как дата и время) – user2486157

0

Колонка X не существует в tDataMult потому что это псевдоним. Замените его на answer_6 в функции DateDiff.

Однако одним из возможных значений столбца answer_6 является формат varchar ('Now'). Для правильной работы функции DATEDIFF необходим правильный формат данных. (например: 'yyyy-mm-dd').