按日期时间分组忽略时间部分

Ste*_*ven 5 sql sql-server time datetime group-by

是否可以编写一个Microsoft SQL查询,该查询将按datetime数据类型分组但忽略时间部分,例如小时和分钟?

Mar*_*ith 12

如果您使用的是SQL Server 2008,这很简单.

GROUP BY CAST(YourCol AS Date)
Run Code Online (Sandbox Code Playgroud)

对于以前的版本,您可以使用

GROUP BY DATEDIFF(DAY, 0, YourCol)
Run Code Online (Sandbox Code Playgroud)

但是,这些都不能利用这样一个事实,即按YourCol顺序排列的索引datetime也将被排序date,因此使用没有排序操作的流聚合.

在SQL Server 2008+上,您可能会考虑编制索引(date,time)而不是datetime促进此类查询.

通过简单地将其存储为两个单独的组件并且可能提供重新组合这些部分的计算列(a datetime2存储与a date和a 相同,time因此除了附加列推NULL_BITMAP送到新字节之外不会消耗更多空间).

CREATE TABLE T
(
YourDateCol date,
YourTimeCol time,
YourDateTimeCol AS  DATEADD(day, 
                            DATEDIFF(DAY,0,YourDateCol), 
                            CAST(YourTimeCol AS DATETIME2(7)))
/*Other Columns*/
)
Run Code Online (Sandbox Code Playgroud)

或者,您可以将它组合存储在基表中,并使索引使用将其拆分出来的计算列.

这种方法的一个例子

CREATE TABLE T
(
DT DATETIME2,
D AS CAST(DT AS DATE),
T AS CAST(DT AS TIME)
)

CREATE INDEX IX1 ON T(DT);

SELECT COUNT(*), 
       CAST(DT AS DATE)
FROM T
GROUP BY CAST(DT AS DATE)

CREATE INDEX IX2 ON T(D,T);

SELECT COUNT(*), 
       CAST(DT AS DATE)
FROM T
GROUP BY CAST(DT AS DATE)

DROP TABLE T
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 在这种情况下,`GROUP BY DATEDIFF(DAY,0,YourCol)`也可能就够了...... (3认同)