Могу ли я использовать функции приведения типов в выражении group by? - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу группировать свои записи на основе столбца LogInDate.Тип данных LogInDate - datetime, но я хочу использовать GROUP BY только с датой в этом поле и не хочу включать время.

Вот что я пытался получитьуникальный счетчик входа в систему за последние 7 дней

select LogInDate,count(*)
    from Login
    group by  LogInDate,UserID
    having LogInDate< (getdate() - 6);

Но он группируется на основе даты и времени значения LogInDate.Я пытался использовать CONVERT внутри GROUP BY следующим образом

select LogInDate,count(*)
    from Login
    group by CONVERT(date,LogInDate) ,UserID
    having LogInDate< (getdate() - 6);

, но потом не получилось сказать:

Msg 8121, уровень 16,Состояние 1, строка 17 Столбец «Login.LogInDate» недопустим в предложении HAVING, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Я поместил пример данных ниже для справки.

CREATE TABLE #LoginValues(LoginDate datetime, UserID int)
INSERT INTO #LoginValues
values ('2019-01-28', 2), ('2019-01-29', 1),('2019-01-22', 3),('2019-01-28', 3);

DECLARE @Filterdate DATE = DATEADD(dd,-6,getdate())
;WITH CTE_LoginDate
AS
(
select cast(LogInDate as Date) AS LoginDate,UserID
    from #LoginValues
    WHERE LoginDate > @Filterdate
)
SELECT LoginDate, COUNT(*)
from cte_loginDate
group by LoginDate
0 голосов
/ 01 февраля 2019

Для having вам нужно использовать агрегирование следующим образом

having max(CONVERT(date,LogInDate))>= (getdate() - 6)

Но в вашем случае это можно сделать с помощью where clause, как показано ниже -

    select CONVERT(date,LogInDate),count(*)
        from Login where LogInDate< (getdate() - 6)
        group by CONVERT(date,LogInDate) 
...