SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
Я получаю "недопустимое имя столбца daysdiff". Maxlogtm - это поле даты. Это мелочь, которая сводит меня с ума.
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
Я получаю "недопустимое имя столбца daysdiff". Maxlogtm - это поле даты. Это мелочь, которая сводит меня с ума.
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
Обычно вы не можете ссылаться на полевые псевдонимы в предложении WHERE
. (Подумайте об этом как о SELECT
, включая псевдонимы, применяется после предложения WHERE
.)
Но, как упоминалось в других ответах, вы можете заставить SQL обрабатывать SELECT
для обработки перед предложением WHERE
. Обычно это делается с помощью скобок для принудительного логического порядка работы или с помощью Common Table Expression (CTE):
Скобки/подвыборки:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
Или см. ответ Ада для версии CTE того же самого.
Если вы хотите использовать псевдоним в своем предложении WHERE
, вам нужно обернуть его в подборе select или CTE:
WITH LogDateDiff AS
(
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120
Если вы не хотите перечислять все ваши столбцы в CTE, другим способом сделать это будет использование outer apply
:
select
s.logcount, s.logUserID, s.maxlogtm,
a.daysdiff
from statslogsummary as s
outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120
Как насчет использования подзапроса (это сработало для меня в Mysql)?
SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
Самый эффективный способ сделать это без повторения вашего кода - использовать HAVING вместо ГДЕ
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
HAVING работает в MySQL согласно документации:
Предложение HAVING было добавлено в SQL, потому что ключевое слово WHERE не могло использоваться с совокупными функциями.