use*_*016 155 sql t-sql sql-server sql-server-2005
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
Run Code Online (Sandbox Code Playgroud)
我明白了
"无效的列名称daysdiff".
Maxlogtm是一个日期时间字段.这是让我疯狂的小东西.
Jam*_*e F 176
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
Run Code Online (Sandbox Code Playgroud)
通常,您不能在WHERE子句中引用字段别名.(将其视为整个SELECT包含别名,在WHERE子句之后应用.)
但是,正如其他答案中所提到的,您可以强制SQL SELECT在WHERE子句之前处理.这通常用括号来强制执行逻辑操作顺序或使用公用表表达式(CTE):
括号/子选择:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
Run Code Online (Sandbox Code Playgroud)
或者看看Adam对CTE版本的回答.
Ada*_*ger 71
如果要在WHERE子句中使用别名,则需要将其包装在子选择或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
Run Code Online (Sandbox Code Playgroud)
如果您不想在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
Run Code Online (Sandbox Code Playgroud)
无需重复执行代码的最有效方法是使用HAVING而不是WHERE
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
Run Code Online (Sandbox Code Playgroud)
怎么样使用子查询(这在Mysql中对我有用)?
SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
Run Code Online (Sandbox Code Playgroud)
小智 5
根据文档,HAVING 在 MySQL 中工作:
在HAVING子句被添加到SQL,因为关键字无法与合计函数使用的地方。
您可以引用列别名,但需要使用以下方式定义它CROSS/OUTER APPLY:
SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;
Run Code Online (Sandbox Code Playgroud)
优点:
WHERE/GROUP BY/ORDER BY