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 BY
sql-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`
.