comment modifier la requête SQL pour get des loggings basés sur les inputs d'heures, minutes et secondes

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 

entrez la description de l'image ici

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