我有一个较旧的sql 2005框,我需要做一些行约500米的表的摘要。
我在表中有一个datetime列,我想从输出和分组中得到它的日期。我知道有几种方法可以做到这一点,但绝对最快的是什么?
由于
答案 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)