SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
alırım
"geçersiz sütun adı daysdiff".
Maxlogtm bir datetime alanıdır. Beni çıldırtan küçük şeyler.
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
alırım
"geçersiz sütun adı daysdiff".
Maxlogtm bir datetime alanıdır. Beni çıldırtan küçük şeyler.
Yanıtlar:
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
Normalde, WHEREyan tümcedeki alan takma adlarına başvuramazsınız. (Diğer SELECTadlar da dahil olmak üzere tümünün , WHEREmaddeden sonra uygulandığını düşünün .)
Ancak, diğer yanıtlarda belirtildiği gibi, SQL'i maddeden SELECTönce ele alınmaya zorlayabilirsiniz WHERE. Bu genellikle mantıksal işlem sırasını zorlamak için parantez veya Ortak Tablo İfadesi (CTE) ile yapılır:
Parantez / Alt Seçim:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
Veya Adem'in aynı CTE sürümü için cevabına bakın.
HAVINGYanıt, bu sorunun söz konusu olduğu MS-SQL de dahil olmak üzere çoğu SQL ortamında çalışmaz. (T-SQL'de HAVINGbir toplama işlevi gerektirir.)
Cümlenizdeki diğer adı kullanmak istiyorsanız WHERE, onu bir alt seçime veya CTE'ye sarmanız gerekir :
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
Kodunuzu tekrar etmeden bunu yapmanın en etkili yolu NEREDE yerine HAVING kullanmaktır.
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
HAVINGTakma adlarda kullanmak standart değil (MySQL üzerinde çalışıyor olsa da) düşünüyorum. Özellikle, SQL Server ile çalışmadığını düşünüyorum.
[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'deki tüm sütunlarınızı listelemek istemiyorsanız, bunu yapmanın başka bir yolu da kullanmaktır 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
Bir alt sorgu kullanmaya ne dersiniz (bu benim için Mysql'de işe yaradı)?
SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
Sütun takma adına başvurabilirsiniz, ancak şunu kullanarak tanımlamanız gerekir 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;
Artıları:
WHERE/GROUP BY/ORDER BYsql-serverve t-sql:)
Buraya geldi buna benzer bir şey arıyorum ama HALİNDE ile ZAMAN ve yerde de böyle kullanılarak bitti: WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0belki kullanabilirsiniz DATEDIFFiçinde WHEREdoğrudan. Gibi bir şey:
SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
`daysdiff`.