comme quand je fais
SELECT [Date]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY [Date]
comment puis-je spécifier la période du groupe?
MS SQL 2008
2e édition
j'essaie
SELECT MIN([Date]) AS RecT, AVG(Value)
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY (DATEPART(MINUTE, [Date]) / 10)
ORDER BY RecT
changé% 10 en / 10. Est-il possible de faire une sortie de date sans millisecondes?
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
, de sorte que lorsque je regarde les données, elles sont corrélées avec le créneau horaire le plus procheDATE(DT.[Date])
.datepart(hour, workingPolicy.workingHours)/2.0
donne1.5
tandis quedatepart(hour, '1900-01-01 09:00:30.000')/2.0
donne4.5
, je ne comprends pas pourquoi? Remarque: workingPolicy.workingHours = 1900-01-01 09: 00: 30.000 . s'il vous plaît aiderJe suis très en retard à la fête, mais cela n'apparaît dans aucune des réponses existantes:
10
etMINUTE
peuvent être modifiés en n'importe quel nombre etDATEPART
, respectivement.DATETIME
valeur, ce qui signifie:SELECT
instruction donnera à votre sortie une colonne avec une jolie sortie tronquée au niveau que vous spécifiez.'2000'
est une "date d'ancrage" autour de laquelle SQL effectuera le calcul de la date. Jereonh a découvert ci - dessous que vous rencontrez un débordement d'entier avec l'ancre précédente (0
) lorsque vous regroupez les dates récentes par secondes ou millisecondes. †Si vos données couvrent des siècles, ‡ l' utilisation d'une seule date d'ancrage pour le regroupement en seconde ou en milliseconde rencontrera toujours le débordement. Si cela se produit, vous pouvez demander à chaque ligne d'ancrer la comparaison de regroupement à minuit de sa propre date:
Utilisez
DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
plutôt que'2000'
partout où il apparaît ci-dessus. Votre requête sera totalement illisible, mais cela fonctionnera.Une alternative pourrait être
CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
le remplacement.† 2 32 ≈ 4.29E + 9, donc si votre
DATEPART
est -SECOND
, vous obtenez 4,3 milliards de secondes de chaque côté, ou « ancre ± 136 ans. » De même, 2 32 millisecondes équivaut à ≈ 49,7 jours.‡ Si vos données couvrent réellement des siècles ou des millénaires et sont toujours exactes à la seconde ou à la milliseconde… félicitations! Quoi que vous fassiez, continuez à le faire.
la source
where
clause avant legroup by
./ 20 * 20
collecter des données par intervalles de 20 minutes? Désolé, j'ai du mal à faire des maths en ce momentThe datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
). Il semble que MINUTE soit la plus petite partie de date que vous puissiez utiliser avec cette approche.0
par'2000'
(les guillemets sont importants!) et réessayezSECOND
.Dans T-SQL, vous pouvez:
ou
à la minute
DATEPART(mi, [Date])
ou
par 10 minutes d'utilisation
DATEPART(mi, [Date]) / 10
(comme Timothy l'a suggéré)la source
Pour un intervalle de 10 minutes, vous
Comme cela a déjà été mentionné par tzup et Pieter888 ... pour faire un intervalle d'une heure, juste
la source
Devrait être quelque chose comme
(Je ne suis pas sûr à 100% de la syntaxe - je suis plutôt du genre Oracle)
Dans Oracle:
la source
La réponse originale donnée par l'auteur fonctionne plutôt bien. Juste pour étendre cette idée, vous pouvez faire quelque chose comme
ce qui vous permettra de regrouper par une période plus longue que 60 minutes, disons 720, soit une demi-journée etc.
la source
Pour MySql:
la source
Ma solution consiste à utiliser une fonction pour créer une table avec les intervalles de dates, puis à joindre cette table aux données que je souhaite regrouper en utilisant l'intervalle de dates dans la table. L'intervalle de date peut alors être facilement sélectionné lors de la présentation des données.
la source
la source
Pour SQL Server 2012, même si je pense que cela fonctionnerait dans SQL Server 2008R2, j'utilise l'approche suivante pour réduire le temps à la milliseconde:
Cela fonctionne par:
@ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
@rms = @ms % @msPerSlice
DATEADD(MILLISECOND, -@rms, time)
Malheureusement, tout comme cela déborde de microsecondes et d'unités plus petites, des ensembles de données plus grands et plus fins devraient utiliser un point fixe moins pratique.
Je n'ai pas rigoureusement évalué cela et je ne suis pas dans le Big Data, donc votre kilométrage peut varier, mais les performances n'étaient pas sensiblement pires que les autres méthodes essayées sur nos équipements et ensembles de données, et le paiement en commodité pour les développeurs pour le découpage arbitraire en vaut la peine. pour nous.
la source
remplacez les deux 600 par n'importe quel nombre de secondes que vous souhaitez grouper.
Si vous en avez souvent besoin et que la table ne change pas, comme le suggère le nom Archive, il serait probablement un peu plus rapide de convertir et de stocker la date (et l'heure) sous forme d'heure unix dans la table.
la source
Je sais que je suis en retard au spectacle avec celui-ci, mais j'ai utilisé cette approche assez simple. Cela vous permet d'obtenir les tranches de 60 minutes sans aucun problème d'arrondi.
la source
la source