Tôi đến bữa tiệc rất muộn, nhưng điều này không xuất hiện trong bất kỳ câu trả lời hiện có nào:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
- Các điều khoản
10
và MINUTE
có thể được thay đổi thành bất kỳ số nào và DATEPART
, tương ứng.
- Đó là một
DATETIME
giá trị, có nghĩa là:
- Nó hoạt động tốt trong khoảng thời gian dài. (Không có va chạm giữa các năm.)
- Bao gồm nó trong
SELECT
câu lệnh sẽ cung cấp cho đầu ra của bạn một cột với đầu ra khá bị cắt ở mức bạn chỉ định.
'2000'
là một "ngày neo" xung quanh việc SQL sẽ thực hiện phép toán ngày. J bdnh đã phát hiện ra bên dưới rằng bạn gặp phải một số nguyên tràn với neo trước đó ( 0
) khi bạn nhóm các ngày gần đây theo giây hoặc mili giây. †
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]
Nếu dữ liệu của bạn kéo dài hàng thế kỷ, ‡ sử dụng một ngày neo duy nhất cho nhóm thứ hai hoặc mili giây vẫn sẽ gặp phải tràn. Nếu điều đó đang xảy ra, bạn có thể yêu cầu mỗi hàng neo so sánh việc đóng thùng với nửa đêm của ngày đó:
Sử dụng DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
thay vì '2000'
bất cứ nơi nào nó xuất hiện ở trên. Truy vấn của bạn sẽ hoàn toàn không thể đọc được, nhưng nó sẽ hoạt động.
Một sự thay thế có thể CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
là sự thay thế.
† 2 32 ≈ 4,29E + 9, vì vậy nếu DATEPART
là của bạn SECOND
, bạn nhận được 4,3 tỷ giây ở hai bên hoặc "neo ± 136 năm". Tương tự, 2 32 mili giây là .7 49,7 ngày.
‡ Nếu dữ liệu của bạn thực sự nhịp thế kỷ hoặc thiên niên kỷ và là vẫn còn chính xác đến từng giây hoặc millisecond ... xin chúc mừng! Dù bạn đang làm gì, hãy tiếp tục làm nó.
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
, để khi tôi nhìn vào dữ liệu, nó tương quan với khe thời gian gần nhất