2010-08-19 32 views
1

我需要查詢大量行(包含時間戳列)並按天彙總結果。訣竅是我需要將聚合函數從上午6點分組到上午6點的第二天,而不是從午夜到午夜。SQL - GroupByDay從上午6點到上午6點的最佳方式

顯然,我可以做一些「DATEPART(日期,時間戳-6小時)」,但對於數百萬行,這似乎增加了相當多的工作到服務器。實際上,它會將查詢速度從幾秒鐘減慢到2分鐘以上,並最終超時。

這樣做的更好方法是什麼?

+1

我希望'所有的道路都通向羅馬',或者更確切地說是你的建議方法的重複,除非你願意並且能夠改變你的表格模式以包含第二列'報告日'。 – 2010-08-19 22:03:20

+0

這是爲什麼這個標記爲SQL Server 2008和PostgreSQL? – 2010-08-19 22:03:29

+0

我需要這個在SQL2008和postgresql上工作。應該在後 – Radu094 2010-08-20 08:14:37

回答

1

下面的T-SQL將在SQL Server中執行您想要的操作。但是,由於dt列的函數封裝,沒有索引可以使用,因此性能在大量行中不會很高。出於性能方面的考慮,您可以考慮在表中添加一個新的計算列,以存儲時間偏移(-6小時)的日期。然後這個新的列可以被編入索引並且性能應該很好。

如果存在(SELECT * FROM sys.objects中WHERE的object_id =的object_id(N'dbo.t ')和類型中(N'U'))
降表dbo.t

創建表dbo.t (DT日期時間不爲空)

插入到dbo.t值( '20100819 05:00')
插入到dbo.t值( '20100819 07:00')
插入到dbo.t值( '20100819 23:00')
insert into dbo.t values('20100820 04:00')
insert into dbo.t value S( '20100820 11:00')
INSERT INTO dbo.t VALUES( '20100820 13:00')
INSERT INTO dbo.t VALUES( '20100821 00:45')

選擇轉換(日期,DATEADD(HH,-6,DT)),爲[日期],
COUNT(DT)通過轉換(日期,DATEADD(HH [COUNT]由dbo.t

,-6,DT))

1

難道你不能使用AT TIME ZONE來轉移午夜而不使用昂貴的計算嗎?

+0

感謝您的ideea!你有什麼樣的例子可以在SQL2008中做到嗎? – Radu094 2010-08-20 08:15:57

+0

不抱歉,我不是微軟的傢伙。 – 2010-08-20 09:29:30

相關問題