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, WHERE
yan tümcedeki alan takma adlarına başvuramazsınız. (Diğer SELECT
adlar da dahil olmak üzere tümünün , WHERE
maddeden 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.
HAVING
Yanıt, bu sorunun söz konusu olduğu MS-SQL de dahil olmak üzere çoğu SQL ortamında çalışmaz. (T-SQL'de HAVING
bir 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
HAVING
Takma 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 BY
sql-server
ve 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) = 0
belki kullanabilirsiniz DATEDIFF
içinde WHERE
doğrudan. Gibi bir şey:
SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
`daysdiff`
.