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
절 보다 먼저 처리 되도록 강제 할 수 있습니다 . 이것은 일반적으로 논리 연산 순서를 강제하기 위해 괄호 나 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의 답변을 참조하십시오.
답변
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
답변
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은 설명서에 따라 MySQL에서 작동합니다.
HAVING 를 Where 키워드 집계 함수와 함께 사용할 수 없기 때문에 절은 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;
장점 :
- 표현의 단일 정의 (복사-붙여 넣기를 유지하기가 더 쉬움)
- CTE / 외부 쿼리로 전체 쿼리를 래핑 할 필요가 없습니다.
- 언급 가능성
WHERE/GROUP BY/ORDER BY
- 더 나은 성능 (단일 실행)