在T-SQL中按Date分组DateTime列的最快方法是什么

时间:2011-09-01 23:23:00

标签: sql-server-2005 tsql

我有一个较旧的sql 2005框,我需要做一些行约500米的表的摘要。

我在表中有一个datetime列,我想从输出和分组中得到它的日期。我知道有几种方法可以做到这一点,但绝对最快的是什么?

由于

2 个答案:

答案 0 :(得分:3)

怀疑最快的将是:

SELECT
  the_day = DATEADD(DAY, the_day, '19000101'), 
  the_count
FROM
(
  SELECT 
    the_day = DATEDIFF(DAY, '19000101', [the_datetime_column]), 
    the_count = COUNT(*)
  FROM dbo.the_table
  GROUP BY DATEDIFF(DAY, '19000101', [the_datetime_column])
  WHERE ...
) AS x;

但“最快”在这里是相对的,它将在很大程度上取决于表中的索引,如何过滤行等。您将希望针对其他典型的日期截断方法进行测试,例如{{ 1}}。

您可以考虑 - 取决于此查询是否比写入性能更重要 - 添加带有索引或索引视图的持久计算列,这将有助于在写入时间而不是查询时间进行此聚合。

答案 1 :(得分:1)

我想你可以通过这种方式获得更好的表现。

SELECT cast(cast([actiontime]+.5 as int) as datetime) as [yourdate], count(*) as count
FROM <yourtable>
GROUP BY cast([<yourdate>]+.5 as int)

升级到mssql server 2008后,您可以改进这一点。

SELECT cast([<yourdate>] as date) as [yourdate], count(*) as count
FROM <yourtable>
GROUP BY cast([<yourdate>] as date)