Я супер опоздал на вечеринку, но это не отражено ни в одном из существующих ответов:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
10
И MINUTE
сроки могут быть изменены в любое число и DATEPART
, соответственно.
- Это
DATETIME
значение, которое означает:
- Он отлично работает через длительные промежутки времени. (Между годами нет столкновения.)
- Включение этого в
SELECT
оператор даст вашему выводу столбец с довольно усеченным выводом на указанном вами уровне.
'2000'
является «якорной датой», вокруг которой SQL будет выполнять математическую обработку даты. Джереон обнаружил ниже, что вы сталкиваетесь с целочисленным переполнением с предыдущей привязкой ( 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 дня.
‡ Если ваши данные на самом деле пролеты веков или Millenia и является до сих пор с точностью до секунды или миллисекунды ... поздравляем! Что бы вы ни делали, продолжайте делать это.
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
так, чтобы, когда я смотрю на данные, они коррелировали с ближайшим временным интервалом