我需要查询大量的行(包含一个时间戳列),并按天聚合结果。诀窍是我需要从早上6点到第二天早上6点对聚合函数进行分组,而不是从午夜到午夜。
显然,我可以执行某种"group by DATEPART(day,Timestamp-6小时)“,但是对于数百万行而言,这似乎会给服务器增加相当多的工作。实际上,它会使查询从几秒钟减慢到超过2分钟,并最终超时。
做这件事的更好的方法是什么?
发布于 2010-08-20 23:48:22
下面的T-SQL将在SQL Server中执行您想要的操作。但是,对于大量的行,性能不会很好,因为包装dt列的函数不能使用索引。出于性能方面的原因,您可以考虑向表中添加一个新的计算列来存储带有时间偏移量(-6小时)的日期。然后可以对这个新列进行索引,并且性能应该是好的。
如果存在(select * from sys.objects WHERE object_id = object_id(N'dbo.t')并键入(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')
选择convert(date,dateadd(HH,-6,dt))作为日期,
计数(Dt)作为计数
来自dbo.t
group by convert(date,date date(HH,-6,dt))
发布于 2010-08-20 06:03:23
你不能使用AT时区来调整午夜时间而不用昂贵的计算吗?
https://stackoverflow.com/questions/3526620
复制相似问题