답변:
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
일반적으로 WHERE
절 에서 필드 별명을 참조 할 수 없습니다 . ( SELECT
별명을 포함 하여 전체 를 생각 하면 WHERE
절 뒤에 적용됩니다 .)
그러나 다른 답변에서 언급했듯이 SQL SELECT
이 WHERE
절 보다 먼저 처리 되도록 강제 할 수 있습니다 . 이것은 일반적으로 논리 연산 순서를 강제하기 위해 괄호 나 CTE (Common Table Expression)로 수행됩니다.
괄호 / 하위 선택 :
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
또는 CTE 버전에 대한 Adam의 답변을 참조하십시오.
HAVING
이 질문에 대한 MS-SQL을 포함한 대부분의 SQL 환경에서는 답이 작동하지 않습니다. (T-SQL에서는 HAVING
집계 함수가 필요합니다.)
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
코드를 반복하지 않고 가장 효과적인 방법 은 WHERE 대신 HAVING을 사용하는 것입니다.
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
HAVING
별칭 사용은 표준이 아니라고 생각 합니다 (MySQL에서는 작동합니다). 특히 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.
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
컬럼 별명을 참조 할 수 있지만 다음을 사용하여 정의해야합니다 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;
장점 :
WHERE/GROUP BY/ORDER BY
sql-server
와 t-sql
:
`daysdiff`
합니다.