Sono in ritardo alla festa, ma questo non appare in nessuna delle risposte esistenti:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
- I termini
10e MINUTEpossono essere cambiati in qualsiasi numero e DATEPART, rispettivamente.
- È un
DATETIMEvalore, che significa:
- Funziona bene su lunghi intervalli di tempo. (Non vi è alcuna collisione tra gli anni.)
- Includendolo nell'istruzione, il
SELECTtuo output sarà una colonna con output piuttosto troncato al livello specificato.
'2000'è una "data di ancoraggio" attorno alla quale SQL eseguirà la matematica della data. Jereonh ha scoperto di seguito che si verifica un overflow di numeri interi con l'ancora precedente ( 0) quando si raggruppano le date recenti per secondi o millisecondi. †
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]
Se i tuoi dati durano secoli, ‡ l' utilizzo di una singola data di ancoraggio per il raggruppamento di secondi o millisecondi incontrerà comunque l'overflow. Se ciò accade, puoi chiedere a ciascuna riga di ancorare il confronto binning alla mezzanotte della sua data:
Usa DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)invece di '2000'dove appare sopra. La tua query sarà totalmente illeggibile, ma funzionerà.
Un'alternativa potrebbe essere CONVERT(DATETIME, CONVERT(DATE, aa.[date]))la sostituzione.
† 2 32 ≈ 4.29E + 9, quindi se i vostri DATEPARTa dire SECOND, si ottiene 4,3 miliardi di secondi su entrambi i lati, o "ancora ± 136 anni." Allo stesso modo, 2 32 millisecondi sono ≈ 49,7 giorni.
‡ Se i tuoi dati si estendono in realtà per secoli o millenni ed è ancora accurato al secondo o millisecondo ... congratulazioni! Qualunque cosa tu stia facendo, continua a farlo.
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5, in modo che quando guardo i dati sia correlato con la fascia oraria più vicina