我可以在group by子句中使用类型转换函数吗?

时间:2019-02-01 06:41:07

标签: sql sql-server group-by

我想根据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);

,但随后失败:

  

消息8121,级别16,状态1,行17在HAVING子句中,'Login.LogInDate'列无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。

2 个答案:

答案 0 :(得分:2)

对于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) 

答案 1 :(得分:0)

我在下面放置了示例数据供您参考。

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