SQL - 从早上6点到早上6点的GroupByDay的最佳方式

时间:2010-08-19 21:57:37

标签: sql sql-server-2008 postgresql

我需要查询大量行(包含时间戳列)并按日汇总结果。诀窍是我需要将聚合函数从早上6点到第二天早上6点分组,而不是从午夜到午夜。

显然,我可以做一些“按DATEPART分组(日,时间戳 - 6小时)”,但对于数百万行,这似乎为服务器增加了相当多的工作量。实际上,它会将查询从几秒钟减慢到超过2分钟,并最终会超时。

这样做的更好方法是什么?

2 个答案:

答案 0 :(得分:1)

你不能使用AT TIME ZONE在没有昂贵计算的情况下午夜转移吗?

答案 1 :(得分:1)

下面的T-SQL将在SQL Server中执行您想要的操作。但是,由于包装dt列的函数不能使用索引,因此在大量行上性能不会很好。出于性能原因,您可以考虑向表中添加新的计算列以存储具有时间偏移(-6小时)的日期。然后可以将这个新列编入索引,并且性能应该没问题。

if exists(select * from sys.objects WHERE object_id = object_id(N'dbo.t')AND输入(N'U'))
drop table dbo.t

创建表dbo.t     (dt datetime not null)

插入dbo.t值('20100819 05:00')
插入dbo.t值('20100819 07:00')
插入dbo.t值('20100819 23:00')
插入dbo.t值('20100820 04:00')
插入dbo.t值('20100820 11:00')
插入dbo.t值('20100820 13:00')
插入dbo.t值('20100821 00:45')

选择转换(date,dateadd(HH,-6,dt))为[Date],
COUNT(dt)为[Count]
来自dbo.t
按转换分组(date,dateadd(HH,-6,dt))