如何按小时或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。是否可以使毫秒输出date?

终于完成了

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

在T-SQL中,您可以:

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

要么

按分钟使用DATEPART(mi, [Date])

要么

通过10分钟使用DATEPART(mi, [Date]) / 10 (如Timothybuild议)

间隔10分钟,你会的

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

正如tzup和Pieter888已经提到的那样,每隔一小时就要做一次

 GROUP BY DATEPART(HOUR, [Date]) 

作者给出的原始答案非常好。 只是为了扩展这个想法,你可以做类似的事情

 group by datediff(minute, 0, time)/10 

这可以让你分组更长的时间,然后60分钟,如720,这是半天等。

我对这个晚会太晚了,但是这个问题并没有出现在现有的答案中:

 group by dateadd(minute, datediff(minute, 0, DT.[Date]) / 10 * 10, 0) 
  • 10minute条款可以分别更改为任何数字和datepart
  • 这是一个datetime值,这意味着:
    • 它在很长的时间间隔内工作得很好(几年之间没有任何碰撞)。
    • 将它包含在select语句中将为您的输出提供一个在您指定的级别上被截断的漂亮输出的列。
 SELECT dateadd(minute, datediff(minute, 0, DT.[Date]) / 10 * 10, 0) as [Date_Truncated], count(*) as [Records_in_Interval], avg(Value) as [Average_Value] FROM [FRIIB].[dbo].[ArchiveAnalog] GROUP BY dateadd(minute, datediff(minute, 0, DT.[Date]) / 10 * 10, 0) ORDER BY [Date_Truncated] 

应该是这样的

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

(不是100%确定的语法 – 我更像是一个Oracletypes的人)

在Oracle中:

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

对于MySql:

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

我的解决scheme是使用一个函数来创build一个具有date间隔的表,然后将这个表连接到我想要使用表中的date间隔进行分组的数据。 在呈现数据时,可以很容易地selectdate间隔。

 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 

对于SQL Server 2012,虽然我相信它可以在SQL Server 2008R2中工作,但我使用以下方法将时间分割为毫秒级:

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

这工作:

  • 获取固定点和目标时间之间的毫秒数:
    @ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
  • 将余下的毫秒分成时间片:
    @rms = @ms % @msPerSlice
  • 将剩余的负数加到目标时间以获得切片时间:
    DATEADD(MILLISECOND, -@rms, time)

不幸的是,由于这是微秒和更小的单位溢出,更大,更精细的数据集将需要使用不太方便的定点。

我没有严格的testing基准,我没有大数据,所以你的里程可能会有所不同,但是性能并没有比我们的设备和数据集上的其他方法明显更差,并且开发人员在任意切片方便的支付使得值得为了我们。

这很容易

 GROUP BY HOUR(yourDateField)