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
10
y MINUTE
se pueden cambiar a cualquier número y DATEPART
, respectivamente.
- Es un
DATETIME
valor, lo que significa:
- Funciona bien en largos intervalos de tiempo. (No hay colisión entre años).
- Incluirlo en la
SELECT
declaració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 DATEPART
es 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