2016-10-12 11 views
1

basiert Ich arbeite mit sqlserver und C#. Ich muss eine Dropdown-Box mit Zeiten von 30 Minuten Inkrement zwischen einer Start- und Endzeit aus einer Tabelle namens time_series auffüllen. Zum Beispiel wird das Datum, das aus dieser Tabelle gelesen wird, wie 10.00 Uhr, 10.30 Uhr, 11.00 Uhr, 11.30 Uhr, 17.00 Uhr sein. Ich habe noch zwei Tabellen mit Start (start_time-Tabelle) und Endzeiten (end_time-Tabelle) mit bestimmten Werten. Wenn beispielsweise die start_time-Tabelle einen Wert von 11:00 Uhr hat, sollte die Zeitreihe von 11:00 Uhr statt 10:00 Uhr beginnen. Wenn die Endzeittabelle einen Wert von 3:00 pm hat, sollte die Zeitreihe in ähnlicher Weise nur bis 3:00 pm und nicht bis 17:00 pm gehen. Gibt es eine Möglichkeit, es in SQL zu tun? Ich könnte es in C# tun, indem ich zunächst alle drei Tabellen lese und dann die Zeitreihe durch Werte für die Tabellen start_time und end_time einschränke. Allerdings würde ich es gerne in SQL ohne C# machen.Wie die Werte eingeschränkt werden, die von einer Tabelle gelesen werden, die auf einer anderen Tabelle in sql

Dank

+0

Dies ist ein großartiger Ort zu starten. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

Antwort

1

Dadurch wird eine Liste von 30 Minuten Sprünge, beginnend mit der vorgegebenen Zeit und endet mit der angegebenen Endzeit für das gegebene Zieldatum erstellen:

DECLARE @StartTime TIME={t'08:00:00'}; 
DECLARE @EndTime TIME={t'17:30:00'}; 

DECLARE @targetDate DATETIME={d'2016-10-12'}; 

WITH JumpsOf30 AS 
(
    SELECT TOP 48 (ROW_NUMBER() OVER(ORDER BY(SELECT NULL))-1) * 30 AS Jump 
    FROM sys.objects --you don't need more than 48, so the count of this table should suffice... 
) 
SELECT DATEADD(MINUTE,Jump,@targetDate+CAST(@StartTime AS datetime)) 
FROM JumpsOf30 
WHERE DATEADD(MINUTE,Jump,@targetDate+CAST(@StartTime AS datetime))<[email protected]+CAST(@EndTime AS datetime) 
1

Ich benutze eine TVF dynamisch zu erstellen Datetime-Bereiche. Es ist viel schneller als der CTE-Ansatz.

Select * 
     ,TimeString=Format(RetVal,'hh:mm:ss tt') 
From [dbo].[udf-Range-Date]('1900-01-01 10:00:00','1900-01-01 17:00:00','MI',30) 
Where Cast(RetVal as Time)>=cast(GetDate() as Time) 

Returns

RetSeq RetVal      TimeString << Current time was 3:22pm 
12  1900-01-01 15:30:00.000 03:30:00 PM 
13  1900-01-01 16:00:00.000 04:00:00 PM 
14  1900-01-01 16:30:00.000 04:30:00 PM 
15  1900-01-01 17:00:00.000 05:00:00 PM 

Die UDF von

benötigt
CREAT FUNCTION [dbo].[udf-Range-Date] (@R1 datetime,@R2 datetime,@Part varchar(10),@Incr int) 
Returns Table 
Return (
    with cte0(M) As (Select 1+Case @Part When 'YY' then DateDiff(YY,@R1,@R2)/@Incr When 'QQ' then DateDiff(QQ,@R1,@R2)/@Incr When 'MM' then DateDiff(MM,@R1,@R2)/@Incr When 'WK' then DateDiff(WK,@R1,@R2)/@Incr When 'DD' then DateDiff(DD,@R1,@R2)/@Incr When 'HH' then DateDiff(HH,@R1,@R2)/@Incr When 'MI' then DateDiff(MI,@R1,@R2)/@Incr When 'SS' then DateDiff(SS,@R1,@R2)/@Incr End), 
     cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Top (Select M from cte0) Row_Number() over (Order By (Select NULL)) From cte1 a, cte1 b, cte1 c, cte1 d, cte1 e, cte1 f, cte1 g, cte1 h), 
     cte3(N,D) As (Select 0,@R1 Union All Select N,Case @Part When 'YY' then DateAdd(YY, N*@Incr, @R1) When 'QQ' then DateAdd(QQ, N*@Incr, @R1) When 'MM' then DateAdd(MM, N*@Incr, @R1) When 'WK' then DateAdd(WK, N*@Incr, @R1) When 'DD' then DateAdd(DD, N*@Incr, @R1) When 'HH' then DateAdd(HH, N*@Incr, @R1) When 'MI' then DateAdd(MI, N*@Incr, @R1) When 'SS' then DateAdd(SS, N*@Incr, @R1) End From cte2) 

    Select RetSeq = N+1 
      ,RetVal = D 
    From cte3,cte0 
    Where D<[email protected] 
) 
/* 
Max 100 million observations -- Date Parts YY QQ MM WK DD HH MI SS 
Syntax: 
Select * from [dbo].[udf-Range-Date]('2016-10-01','2020-10-01','YY',1) 
Select * from [dbo].[udf-Range-Date]('2016-01-01','2017-01-01','MM',1) 
*/ 
Verwandte Themen