Answers:
终于完成了
GROUP BY
DATEPART(YEAR, DT.[Date]),
DATEPART(MONTH, DT.[Date]),
DATEPART(DAY, DT.[Date]),
DATEPART(HOUR, DT.[Date]),
(DATEPART(MINUTE, DT.[Date]) / 10)
datepart(hour, workingPolicy.workingHours)/2.0
给出1.5
同时datepart(hour, '1900-01-01 09:00:30.000')/2.0
给出了4.5
,我不明白为什么?注意:workingPolicy.workingHours = 1900-01-01 09:00:30.000。请帮助
我参加聚会太迟了,但是在任何现有的答案中都没有出现:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
10
和MINUTE
条件是可以改变的任何号码并且DATEPART
分别。DATETIME
值,表示:
SELECT
语句中包含它会为您的输出提供一列,并在您指定的级别截断漂亮的输出。'2000'
是一个“锚定日期”,SQL将围绕该日期执行日期数学运算。Jereonh 在下面发现,0
以秒或毫秒为单位对最近的日期进行分组时,前一个锚点()遇到整数溢出。†SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
AS [date_truncated],
COUNT(*) AS [records_in_interval],
AVG(aa.[value]) AS [average_value]
FROM [friib].[dbo].[archive_analog] AS aa
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
ORDER BY [date_truncated]
如果您的数据跨越几个世纪以来,‡使用二线单个锚日期或毫秒分组仍然会遇到溢出。如果发生这种情况,您可以要求每一行将合并比较锚定到其日期的午夜:
使用DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
而不是'2000'
上面出现的任何地方。您的查询将完全不可读,但可以使用。
另一种可能是CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
替代品。
† 2 32 ≈4.29E + 9,所以如果你的DATEPART
就是SECOND
,你得到4.3十亿秒两边,或“锚±136年。” 同样,2 32毫秒等于≈49.7天。
‡如果您的数据实际上跨越了几个世纪或一千年,并且仍然精确到秒或毫秒……恭喜!无论您在做什么,都要继续做。
where
在之前放置一个子句group by
。
/ 20 * 20
为与以20分钟为间隔收集数据相同吗?抱歉,我现在正在努力学习数学。
The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
)。似乎MINUTE是您可以使用此方法的最小日期部分。
0
改为'2000'
(引号很重要!),然后重试SECOND
。
在T-SQL中,您可以:
SELECT [Date]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY [Date], DATEPART(hh, [Date])
要么
通过分钟使用 DATEPART(mi, [Date])
要么
使用10分钟DATEPART(mi, [Date]) / 10
(如提摩太建议的)
每隔10分钟,您将
GROUP BY (DATEPART(MINUTE, [Date]) / 10)
正如tzup和Pieter888所提到的...间隔一个小时,
GROUP BY DATEPART(HOUR, [Date])
应该是这样的
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
我的解决方案是使用一个函数来创建一个具有日期间隔的表,然后将该表与要使用表中日期间隔进行分组的数据连接起来。然后,在显示数据时可以轻松选择日期间隔。
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
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)
对于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)
不幸的是,由于这种溢出以微秒和较小的单位为单位,因此较大,较细的数据集将需要使用不太方便的固定点。
我尚未对此进行严格的基准测试,也无法使用大数据,因此您的里程可能会有所不同,但是性能并不比我们在设备和数据集上尝试的其他方法明显差,并且为任意切片而在开发人员中带来的便利使它值得为我们。
select dateadd(minute, datediff(minute, 0, Date), 0),
sum(SnapShotValue)
FROM [FRIIB].[dbo].[ArchiveAnalog]
group by dateadd(minute, datediff(minute, 0, Date), 0)
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
,因此当我查看数据时,它与最近的时隙相关