SQL Server组按日期和时间

use*_*794 2 sql sql-server datetime group-by

使用SQL Server,我有一个表,CreatedAt其中包含一个具有datetime数据类型的列.我正在尝试编写一个查询,该查询将返回每个日期的总记录,但也会将日期分为一天中的时间,即上午,下午和晚上.因此,例如,下表

ID     createdAt
------------------------------
1      2017-10-17 21:31:52.160
2      2017-10-17 12:12:12.160
3      2017-10-17 09:09:09.160
4      2017-10-17 21:31:52.160
5      2017-10-16 21:31:52.160
Run Code Online (Sandbox Code Playgroud)

会返回以下结果

DayCounter    SessionDay    Morning    Afternoon    Evening
4             2017-10-17    1          1            2
1             2017-10-16    0          0            1
Run Code Online (Sandbox Code Playgroud)

我有以下两个查询按天分组数据,然后拆分从日期中提取时间,但我无法弄清楚如何将它们放在一起.

SELECT 
    COUNT(createdAt) AS counter, 
    CONVERT(DATE, createdAt) AS sessionDay
FROM 
    MyTable
GROUP BY 
    CONVERT(DATE, createdAt)
Run Code Online (Sandbox Code Playgroud)

SELECT 
    CASE 
       WHEN CAST(CONVERT(CHAR(2), createdAt, 108) AS INT) < 12 
          THEN 'Morning'
       WHEN CAST(CONVERT(CHAR(2), createdAt, 108) AS INT) < 17 
          THEN 'Afternoon'
       ELSE 'Evening' 
    END AS sessionPeriod, 
    createdAt 
FROM 
    MyTable
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 9

您似乎想要条件聚合,以及更清楚地使用日期/时间函数:

select cast(createdAt as date),
       sum(case when datepart(hour, createdat) < 12 then 1 else 0 end) as Morning,
       sum(case when datepart(hour, createdat) >= 12 and datepart(hour, createdat) < 17 then 1 else 0 end) as Afternoon,
       sum(case when datepart(hour, createdat) >= 17 then 1 else 0 end) as Evening
from mytable
group by cast(createdAt as date)
order by cast(createdAt as date);
Run Code Online (Sandbox Code Playgroud)