SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
я отримав
"недійсна назва стовпця".
Maxlogtm - це поле дати. Саме ця штучка зводить мене з розуму.
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
я отримав
"недійсна назва стовпця".
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.
HAVINGВідповідь не працює в більшості середовищ SQL, включаючи MS-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
Найефективніший спосіб зробити це без повторення коду - це використання HAVING замість WHERE
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
Як щодо використання підзапиту (це працювало для мене в Mysql)?
SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE 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 BYsql-serverі t-sql:)
Приїхав сюди в пошуках що - щось подібне, але з випадком , коли, і закінчився , використовуючи , де , як це: WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0може бути , ви могли б використовувати DATEDIFFв WHEREбезпосередньо. Щось на зразок:
SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
`daysdiff`.