2011-02-15 71 views
118

當我做如何分組時間小時減少10分鐘

SELECT [Date] 
    FROM [FRIIB].[dbo].[ArchiveAnalog] 
    GROUP BY [Date] 

我怎麼能指定組週期是怎樣的?

MS SQL 2008

第二編輯

我想

SELECT MIN([Date]) AS RecT, AVG(Value) 
    FROM [FRIIB].[dbo].[ArchiveAnalog] 
    GROUP BY (DATEPART(MINUTE, [Date])/10) 
    ORDER BY RecT 

更改了%10/10,是有可能使輸出的日期沒有毫秒?

回答

157

最後用

GROUP BY 
DATEPART(YEAR, DT.[Date]), 
DATEPART(MONTH, DT.[Date]), 
DATEPART(DAY, DT.[Date]), 
DATEPART(HOUR, DT.[Date]), 
(DATEPART(MINUTE, DT.[Date])/10) 
13

在T-SQL可以:

SELECT [Date] 
    FROM [FRIIB].[dbo].[ArchiveAnalog] 
    GROUP BY [Date], DATEPART(hh, [Date]) 

通過分鐘使用DATEPART(mi, [Date])

通過進行10分鐘使用DATEPART(mi, [Date])/10(像蒂莫西建議)

+0

GROUP BY [日期],DATEPART(11H,[日期])是一片混亂,而不是? – Cynede 2011-02-15 11:07:46

+1

@nCdy應該沒問題,否則你會得到一個錯誤「...在選擇列表中是無效的,因爲它不包含在集合函數或GROUP BY子句中」 – tzup 2011-02-15 11:23:28

+0

如何按照整個日期和按小時分組同一時間?我只是使用Min Date。 – Cynede 2011-02-15 12:18:07

11

間隔10分鐘,你會

GROUP BY (DATEPART(MINUTE, [Date])/10) 

正如已經tzup和Pieter888 ......提到做一個小時的時間間隔,只是

GROUP BY DATEPART(HOUR, [Date]) 
4

應該是肯定的類似

select timeslot, count(*) 
from 
    (
    select datepart('hh', date) timeslot 
    FROM [FRIIB].[dbo].[ArchiveAnalog] 
    ) 
group by timeslot 

(不是100%語法 - 我更像一個Oracle類型的人)

在Oracle中:

SELECT timeslot, COUNT(*) 
FROM 
( 
    SELECT to_char(l_time, 'YYYY-MM-DD hh24') timeslot 
    FROM 
    (
     SELECT l_time FROM mytab 
    ) 
) GROUP BY timeslot 
0

我的解決方案所做的是用一個函數來創建一個表的日期間隔,然後使用該表中的日期間隔加入這個表中的數據我想組。 然後可以在呈現數據時輕鬆選擇日期間隔。

CREATE FUNCTION [dbo].[fn_MinuteIntervals] 
    (
     @startDate SMALLDATETIME , 
     @endDate SMALLDATETIME , 
     @interval INT = 1 
    ) 
RETURNS @returnDates TABLE 
    (
     [date] SMALLDATETIME PRIMARY KEY NOT NULL 
    ) 
AS 
    BEGIN 
     DECLARE @counter SMALLDATETIME 
     SET @counter = @startDate 
     WHILE @counter <= @endDate 
      BEGIN 
       INSERT INTO @returnDates VALUES (@counter) 
       SET @counter = DATEADD(n, @interval, @counter) 
      END 
     RETURN 
    END 
6

原作者給出的作品非常好。只是爲了擴大這個想法,你可以這樣做

group by datediff(minute, 0, [Date])/10 

這將允許您按較長的時間,然後60分鐘,說720,這是一個半天等。

2

對於MySQL:

GROUP BY 
DATE(`your_date_field`), 
HOUR(`your_date_field`), 
FLOOR(MINUTE(`your_date_field`)/10); 
0

對於SQL Server 2012,但我相信它會在SQL Server 2008 R2的工作,我用下面的辦法來獲得時間分片下到毫秒:

DATEADD(MILLISECOND, -DATEDIFF(MILLISECOND, CAST(time AS DATE), time) % @msPerSlice, time) 

作品者:

  • 獲取固定點和目標時間之間的毫秒數:
    @ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
  • 以分割這些毫秒到時間片的剩餘部分:
    @rms = @ms % @msPerSlice
  • 並稱,其餘的負向目標時間去片時間:
    DATEADD(MILLISECOND, [email protected], time)

不幸的是,這是以微秒和更小的單位溢出,所以更大,更精細的數據集將需要使用不太方便的定點。

我還沒有嚴格的測試基準,我不是大數據,所以你的里程可能會有所不同,但性能並沒有比我們的設備和數據集上嘗試的其他方法明顯更差,並且支持開發人員便利性切片使它值得我們。

10

我超級遲到了,但是這並沒有出現在任何現有的答案:

group by dateadd(minute, datediff(minute, 0, DT.[Date])/10 * 10, 0) 
  • 10minute方面可以更改爲任意數量和datepart,分別。
  • 這是一個datetime值,這意味着:
    • 它工作正常,跨越長的時間間隔(年或任何東西之間沒有衝突)。
    • 將它包含在select語句中將爲您的輸出提供一個在您指定的級別上截斷了漂亮輸出的列。
SELECT dateadd(minute, datediff(minute, 0, AA.[Date])/10 * 10, 0) as [Date_Truncated], 
    count(*) as [Records_in_Interval], 
    avg(Value) as [Average_Value] 
FROM [FRIIB].[dbo].[ArchiveAnalog] as AA 
GROUP BY dateadd(minute, datediff(minute, 0, AA.[Date])/10 * 10, 0) 
ORDER BY [Date_Truncated]