SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
eu recebo
"nome da coluna inválido daysdiff".
Maxlogtm é um campo de data e hora. São as pequenas coisas que me deixam louco.
sql
sql-server
tsql
sql-server-2005
user990016
fonte
fonte
`daysdiff`
.Respostas:
Normalmente você não pode se referir a aliases de campo na
WHERE
cláusula. (Pense nisso como o todo,SELECT
incluindo aliases, é aplicado após aWHERE
cláusula.)Mas, como mencionado em outras respostas, você pode forçar o SQL a tratar
SELECT
a ser tratado antes daWHERE
cláusula. Isso geralmente é feito entre parênteses para forçar a ordem lógica de operação ou com uma Expressão de tabela comum (CTE):Parênteses / Subseleção:
Ou veja a resposta de Adam para uma versão CTE do mesmo.
fonte
HAVING
resposta não funciona na maioria dos ambientes SQL, incluindo o MS-SQL, sobre o qual esta pergunta se refere. (Na t-SQL,HAVING
requer uma função agregada.)Se você quiser usar o alias na sua
WHERE
cláusula, precisará envolvê-lo em uma sub-seleção ou CTE :fonte
A maneira mais eficaz de fazer isso sem repetir seu código é usar HAVING em vez de WHERE
fonte
HAVING
de aliases não é padrão (embora funcione no MySQL). Especificamente, acho que não funciona com o SQL Server.[S0001][207] Invalid column name 'daysdiff'
[S0001][8121] Column 'day' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
Se você não deseja listar todas as suas colunas no CTE, outra maneira de fazer isso seria usar
outer apply
:fonte
Que tal usar uma subconsulta (isso funcionou para mim no Mysql)?
fonte
TENDO trabalha no MySQL de acordo com a documentação:
fonte
Você pode consultar o alias da coluna, mas precisa defini-lo usando
CROSS/OUTER APPLY
:DBFiddle Demo
Prós:
WHERE/GROUP BY/ORDER BY
fonte
sql-server
et-sql
:)Vim aqui procurando algo semelhante a isso, mas com um caso quando, e acabou usando a onde assim:
WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0
talvez você poderia usarDATEDIFF
noWHERE
diretamente. Algo como:fonte