2016-10-09 1 views
1

Ich muss alle Zeitwerte berechnen, die zwischen einer bestimmten Startzeit und Endzeit auf der Grundlage eines bestimmten Zeitintervalls an einem Datum in der gespeicherten Prozedur in SQL sind.SQL get Zeitwerte zwischen einem Zeitbereich

Ich habe 4 Parameter für meine gespeicherte Prozedur.

@date_value nvarchar(1000),//date value'2016-10-09' 
@starttime TIME(0) //= '08:00',//suppose starttime is 8am 
@endtime TIME(0) //= '13:00' 
@interval INT //= '20' //20 minutes 

Ich versuche, alle Zeitwerte zwischen der Startzeit und der Endzeit zu erhalten. Ich brauche es so. 8: 00,8: 20,08: 40 ........ bis 12:50 (Endwert brauche ich nicht).

ich gegoogelt es haben und festgestellt, dass wir

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime) 

Hier verwenden kann ich nicht in der Lage bin, das Ende schließen mich time.Please helfen

+0

Haben Sie Ergebnisse als Kommaseparator Wert müssen ?? – Esty

+0

Ich brauche es verschiedene Zeilen für jeden Wert – Techy

Antwort

4
Declare 
@date_value nvarchar(1000)='2016-10-09', 
@starttime TIME(0)= '08:00', 
@endtime TIME(0) = '13:00', 
@interval INT = '20' 



;With cte(stime) 
as 
(
SELECT 
cast(cast(@date_value as datetime) 
    + CONVERT(CHAR(8), @starttime, 108) as time) 
union all 
select 
cast(dateadd(minute,@interval,stime) as time) 
from cte 
where cast(dateadd(minute,@interval,stime) as time)<@endtime 
) 
select * from cte 
+0

Ich brauche die Startzeit auch, – Techy

+0

nur Startzeit hinzufügen, ist Ihr Ausgabeformat nicht klar, so Update-Frage für alle Änderungen – TheGameiswar

+0

Von der obigen Abfrage bekomme ich Ergebnisse als 08:20, 08:40 .... Ich brauche 08:00 auch. Das sollte die erste Reihe sein, – Techy

1
DECLARE @date_value nvarchar(1000) = '2016-10-09' 
DECLARE @starttime TIME(0) = '08:00' 
DECLARE @endtime TIME(0) = '13:00' 
DECLARE @interval INT = '20' 

DECLARE @IterateTime AS TIME(0) = @starttime 
DECLARE @Diff AS INT = (SELECT DATEDIFF(MINUTE, @starttime, @endtime))/@interval 
DECLARE @Iterator AS INT = 0 


WHILE @Iterator < @Diff 
BEGIN 
SELECT @IterateTime = DATEADD(MINUTE, @interval, @IterateTime) 
SELECT @Iterator = @Iterator + 1 
SELECT @IterateTime 
END 
2

Hier ist eine Möglichkeit, ohne LOOP oder Recursion

;with cte as 
(
SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n as seq 
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n), 
    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n), 
    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n), 
    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n) 
),time_gen as 
(
SELECT Dateadd(MINUTE, @interval * seq , Cast(Concat(@date_value, ' ', @starttime) AS DATETIME)) as dates 
FROM cte 
) 
select cast(dates as time) times from time_gen 
WHERE dates < Cast(Concat(@date_value, ' ', @endtime) AS DATETIME) 
order by times 

Hinweis: Wenn Sie nicht SQL SERVER 2012+ verwenden, dann + für Verkettung anstelle von Concat Funktion

+1

Besser als Rekursion. Ich werde dich aufstehen. – Esty

+0

Vielen Dank für Ihren Rat – Techy

+0

@Techy, ich denke, http://StackOverflow.com/Questions/32096103/Selecting-N-Rosen-in-SQL-Server wird für Sie nützlich sein. – Esty

Verwandte Themen