Llego muy tarde a la fiesta, pero esto no aparece en ninguna de las respuestas existentes:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
- Los términos
10y MINUTEse pueden cambiar a cualquier número y DATEPART, respectivamente.
- Es un
DATETIMEvalor, lo que significa:
- Funciona bien en largos intervalos de tiempo. (No hay colisión entre años).
- Incluirlo en la
SELECTdeclaración le dará a su salida una columna con una salida bonita truncada en el nivel que especifique.
'2000'es una "fecha de anclaje" alrededor de la cual SQL realizará la matemática de fecha. Jereonh descubrió a continuación que encuentra un desbordamiento de enteros con el ancla anterior ( 0) cuando agrupa fechas recientes por segundos o milisegundos. †
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]
Si sus datos abarcan siglos, ‡ el uso de una sola fecha de anclaje para la agrupación de segundos o milisegundos seguirá encontrando el desbordamiento. Si eso sucede, puede pedirle a cada fila que ancle la comparación de agrupación a la medianoche de su propia fecha:
Use en DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)lugar de '2000'donde aparezca arriba. Su consulta será totalmente ilegible, pero funcionará.
Una alternativa podría ser CONVERT(DATETIME, CONVERT(DATE, aa.[date]))el reemplazo.
† 2 32 ≈ 4.29E + 9, por lo que si DATEPARTes así SECOND, obtendrá 4.300 millones de segundos a cada lado o "ancla ± 136 años". Del mismo modo, 2 32 milisegundos es ≈ 49.7 días.
‡ Si sus datos realmente abarcan siglos o milenios y aún son precisos al segundo o milisegundo ... ¡felicidades! Lo que sea que estés haciendo, sigue haciéndolo.
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5, de modo que cuando miro los datos se correlaciona con el intervalo de tiempo más cercano