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
10
e MINUTE
possono essere cambiati in qualsiasi numero e DATEPART
, rispettivamente.
- È un
DATETIME
valore, che significa:
- Funziona bene su lunghi intervalli di tempo. (Non vi è alcuna collisione tra gli anni.)
- Includendolo nell'istruzione, il
SELECT
tuo 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 DATEPART
a 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