就像我做的那样

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

如何指定分组时段?我使用的是MS SQL 2008。

我已经试过了,使用% 10和/ 10。

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

是否有可能使日期输出没有毫秒?


当前回答

对于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)

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

我没有严格地对其进行基准测试,我也不是大数据行业的人,所以您的情况可能会有所不同,但性能并不明显比我们在设备和数据集上尝试的其他方法差,而且任意切片在开发人员便利性方面的付出对我们来说是值得的。

其他回答

作者最初给出的答案还不错。为了扩展这个想法,你可以这样做

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

这样你就可以按更长的时间分组,比如60分钟,720分钟,也就是半天。

在T-SQL中,您可以:

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

or

Date (mi, [Date])

or

使用DATEPART(mi, [Date]) / 10(像Timothy建议的那样)

declare @interval tinyint
set @interval = 30
select dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0), sum(Value_Transaction)
from Transactions
group by dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0)

试试这个查询。它是一列。(参考@nobilist的答案)

GROUP BY CAST(DATE(`your_date_field`) as varchar) || ' ' || CAST(HOUR(`your_date_field`) as varchar) || ':' || CAST(FLOOR(minute(`your_date_field`) / 10) AS varchar) || '0' AS date_format

这里有一个选项,提供了该间隔的人类可读的开始时间(7:30,7:40等)。

在临时表中,它使用SMALLDATETIME来截断秒和毫秒,然后主查询在所需的分钟间隔上减去任何数。

SELECT DATEADD(MINUTE, -(DATEDIFF(MINUTE, '2000', tmp.dt) % 10), tmp.dt)
FROM (
    SELECT CAST(DateField AS SMALLDATETIME) AS dt
    FROM MyDataTable
) tmp

它也可以在一行代码中完成,但可读性较差。

SELECT DATEADD(MINUTE, -(DATEDIFF(MINUTE, '2000', CAST(DateField AS SMALLDATETIME)) % 10), CAST(DateField AS SMALLDATETIME)) AS [interval] FROM MyDataTable