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
句の前に処理することができます。これは通常、操作の論理的な順序を強制する括弧で、または共通テーブル式(CTE)で行われます。
括弧/副選択:
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
and t-sql
:)でタグ付けされています
`daysdiff`
。