2017-04-13 2 views
0

Le tableau d'origine a la colonne Horodatage avec IntervalleT-SQL en temps Gpe intervalle par plage de dates dans le serveur SQL

Intervalle: différence de minutes entre le Timestamp actuel et précédent lorsqu'ils sont triés par Horodatage se

Timestamp    Interval(InMinute) 
2016-12-31 00:28:00  NULL 
2016-12-31 00:29:00  1 
2016-12-31 00:30:00  1 
2016-12-31 00:45:00  15 
2016-12-31 01:00:00  15 
2016-12-31 01:15:00  15 
2016-12-31 01:16:00  1 
2016-12-31 01:17:00  1 
2016-12-31 01:18:00  1 
2016-12-31 01:19:00  1 

Je veux détecter un changement d'intervalle de temps à l'aide de T-SQL et produire la sortie

StartDate    EndDate    Interval 
2016-12-31 00:28:00  2016-12-31 00:30:00 1 
2016-12-31 00:30:00  2016-12-31 01:15:00 15 
2016-12-31 01:15:00  2016-12-31 01:19:00 1 

Je voulais dire pendant combien de temps un intervalle est resté le même. La deuxième ligne indique que 2016-12-31 00:30:00-2016-12-31 01:15:00, l'intervalle est resté le même à savoir 15. Mais il a changé à 1 après 2016-12-31 01:15:00

+0

Veuillez ajouter votre structure de données et expliquer la logique pour obtenir le résultat souhaité – TriV

+0

@TriV J'ai légèrement modifié la question – HighAbove

+0

Pourquoi avez-vous passé le tableau 'TimeStamp' '2016-12-31 00: 45: 00'? – TriV

Répondre

0

Essayez le ci-dessous:

declare @tbl table 
(datec datetime) 

insert into @tbl 
select '2016-12-31 00:29:00' 
union all 
select '2016-12-31 00:30:00' 
union all 
select '2016-12-31 00:45:00' 
union all 
select '2016-12-31 01:00:00' 
union all 
select '2016-12-31 01:01:00' 
union all 
select '2016-12-31 01:02:00' 

select datec,nextdatec,datediff(MINUTE,datec,nextdatec) as diff from (
select datec,LEAD(datec) over(order by datec) as nextdatec from @tbl 
) tbl 
where datediff(MINUTE,datec,nextdatec) is not null 
+0

Vous êtes très proche, mais si vous comparez la sortie désirée et la vôtre, ils sont un peu différents – HighAbove

+0

Pour la 2e rangée dans votre sortie, l'intervalle idéal (je suppose) devrait être de 30 minutes, mais il est de 15 minutes. Cochez cette case sélectionnez DATEDIFF (minute, '2016-12-31 00:30:00', '2016-12-31 01:00:00') –

+0

Je voulais juste définir une plage de dates à chaque fois que l'intervalle de temps est en minute changements. Par exemple, l'intervalle de temps entre «2016-12-31 00: 30: 00» et «2016-12-31 01: 00: 00» est resté le même, soit 15 min. Soudain, l'intervalle de temps a changé à 1 de «2016-12-31 01: 00: 00» jusqu'à la fin – HighAbove

0

Cela fonctionne

CREATE TABLE ##T1 (DATE_STAMP DATETIME) 

INSERT INTO ##T1 VALUES ('12-31-2016 00:29:00') 
INSERT INTO ##T1 VALUES ('12-31-2016 00:30:00') 
INSERT INTO ##T1 VALUES ('12-31-2016 00:45:00') 
INSERT INTO ##T1 VALUES ('12-31-2016 01:00:00') 
INSERT INTO ##T1 VALUES ('12-31-2016 01:01:00') 
INSERT INTO ##T1 VALUES ('12-31-2016 01:02:00') 

SELECT ROW_NUMBER() OVER(ORDER BY DATE_STAMP) ID, * INTO ##T2 FROM ##T1 

SELECT A.DATE_STAMP START_DATE 
     ,B.DATE_STAMP END_DATE 
     ,DATEDIFF(MINUTE, A.DATE_STAMP, B.DATE_STAMP) INTERVAL 
FROM ##T2 A 
     INNER JOIN ##T2 B 
     ON B.ID = A.ID + 1 

DROP TABLE ##T1, ##T2 
+0

Ne pas oublier à Endex il lol. Vous avez le même résultat que @Manish Kumar. – HighAbove

+0

'select * dans..': - \ – Adam