J'ai une table qui sera mise à jour chaque seconde avec quelques données. J'ai conçu un formulaire où l'user peut entrer la date de début et la date de fin, l'heure de début et l'heure de fin et choisir l'intervalle pour lequel ils veulent des données. par exemple, s'ils veulent des loggings d'aujourd'hui, ils entreront la date d'aujourd'hui dans les deux zones de text et entreront 1 heure 10 min 10 secondes comme intervalle pour get datatables du jour (24 heures) toutes les 1 heure 10 minutes 10 secondes.
Je construis la requête dynamicment basée sur les inputs de l'user.
requête initiale avant que l'user entre "1 heure 10 min 10 sec"
SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, t0.AddedBy FROM brands t0 WHERE t0.cdt >= @VALUE1 and t0.cdt <=@VALUE2
après l'user, select "1 h 10 min 10 sec"
WITH CTE AS (SELECT *,RN=ROW_NUMBER() OVER( PARTITION BY DATEDIFF(MINUTE, 0, cdt)/10 ORDER BY cdt DESC) from brands) SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, t0.AddedBy FROM cte t0 WHERE RN=1 AND (t0.cdt >= '2013-11-01' and t0.cdt <='2013-11-16')
la requête ci-dessus me donne avec 10 "Minute" intervalle comment le changer pour l'heure, min, sec
brandid brandname cdt udt brandstatus addedby 1 something 2013-11-01 00:00:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:01:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:02:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:03:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:04:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:05:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:06:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:07:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:08:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:09:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:10:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 01:01:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:02:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:03:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 00:30:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 02:10:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 03:00:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 03:01:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 03:02:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 03:03:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 03:15:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 03:20:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 04:10:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 05:10:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 06:21:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 07:51:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 08:01:01.123 2013-11-01 00:00:01.123 1 1
résultat attendu pendant 1 heure 1 min 1 sec
1 something 2013-11-01 01:01:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 01:30:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 02:10:01.123 2013-11-01 00:00:01.123 1 1 1 something 2013-11-01 03:20:01.123 2013-11-01 00:00:01.123 1 1
Le principe de base de l'obtention du groupe par intervalle, comme indiqué dans votre autre thread, datediff () returnnera un entier. Et quand entier split par entier vous donnera le résultat en entier. Alors
10 / 10 = 1 11 / 10 = 1 . . . 19 / 10 = 1
Partition par cela vous donnera un "intervalle" de 10 minutes que vous avez demandé.
Donc, si vous avez besoin d'intervalle comme 1 heure 5 minutes, convertir en minutes est de 65 minutes
Et cela vous donnera l'intervalle de 1 heure 5 minutes
PARTITION BY DATEDIFF(MINUTE, 0, cdt) / 65
Le problème est les secondes. Si vous avez besoin d'un intervalle en secondes, vous devrez utiliser DATEDIFF (SECOND, 0, cdt)
qui entraînera un débordement
Bonne chose, vous avez une date de début @VALUE1
. Vous pouvez donc l'utiliser comme date de reference au lieu de la date 0
PARTITION BY DATEDIFF(SECOND, @VALUE1, cdt)
Donc, tout mettre set, et en convertissant l'intervalle requirejs de 1 h 5 min 10 sec en secondes
declare @interval int select @interval = (1 * 60 * 60) + (5 * 60) + (10) PARTITION BY DATEDIFF(SECOND, @VALUE1, cdt) / @interval
ça devrait le faire