就像我做的那样
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
是否有可能使日期输出没有毫秒?
我的解决方案是使用一个函数创建一个具有日期间隔的表,然后将这个表连接到我想使用表中的日期间隔进行分组的数据。
在显示数据时,可以轻松地选择日期间隔。
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)
不幸的是,由于溢出了微秒和更小的单位,因此更大、更精细的数据集将需要使用不太方便的固定点。
我没有严格地对其进行基准测试,我也不是大数据行业的人,所以您的情况可能会有所不同,但性能并不明显比我们在设备和数据集上尝试的其他方法差,而且任意切片在开发人员便利性方面的付出对我们来说是值得的。