나는 파티에 늦었지만, 기존 답변에는 나타나지 않습니다.
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]))
.
† 이 32 ≈ 4.29E + 9, 그래서 당신의 경우 DATEPART
IS SECOND
, 당신은 양쪽에 43억초를 얻을, 또는 "앵커 ± 1백36년." 마찬가지로 2 32 밀리 초는 9.7 49.7 일입니다.
‡ 데이터가 실제로 수세기 또는 백만년에 걸쳐 있고 여전히 초 또는 밀리 초 까지 정확하다면… 축하합니다! 당신이 무엇을 하든지 계속하십시오.
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
, 그래서이 데이터를 볼 때 가장 가까운 타임 슬롯과 상관 관계가 있다는