nutzloser-user
Goto Top

MSSQL Daten in Zeitraum eingrenzen und addieren

Hallo Community,

ich habe ein kleines Projekt angenommen und versuche mich derzeit ein bisschen damit zurecht zu finden. Leider stoße ich jetzt auf ein Problem, das ich nicht gelöst bekomme und hoffe daher auf eure Hilfe.
Da ich in Programmierung sowie SQL nicht so fit bin, versuche ich code-snippets auf mein geringes vorhandes Know-How anzuwenden. Zu meinem Problem.


Ich habe zwei Tabellen. Eine Tabelle besteht aus Daten die sekündlich/minütlich einen Wert schreiben. Dann habe ich eine Tabelle in der ich händisch die Zeiten eintrage, wann ein Artikel produziert wurde.
Nun möchte ich gerne eine Abfrage bauen, die mir jeweils den Zeitraum eingrentzt. Z.b. Zeile 2 zwischen 20:01 und 22:00 Uhr . Dann soll er alle Daten zwischen diesem Zeitraum aus Tabelle Daten lesen und zusammenaddieren. Ich hoffe das war einigermaßen verständlich.

Ich versuche mal eine beispielausgabe zu schreiben.
Zwischen 19 und 20 Uhr wurden 22 Artikel mit der Artikelnummer 4444 Produziert.
Zwischen 20:01 und 22 Uhr wurden 9 Artikel mit der Artikelnummer 3333 Produziert.
Zwischen 22 und 23:59 Uhr wurden 6 Artikel mit der Artikelnummer 4444 Produziert.


Tabelle Zeiten (Anfangszeit, Endzeit, Artikelnummer)
Spalte 1 | Spalte 2 | Spalte 3
19:00 20:00 4444
20:01 22:00 3333
22:01 23:59 4444


Tabelle Daten (Zeit, Wert)
17:01 44
17:02 86
17:03 92
19:03 10
19:59 12
20:01 9
22:03 5
23:33 1
...

Die Select Anweisung klappt bei mir, allerdings der Rest leider nicht. Ich bin mir auch sicher, ob ein Cursor die richtige Wahl ist?


DECLARE xxxx CURSOR LOCAL STATIC
FOR

SELECT [Spalte1]
FROM [DBNAME].[dbo].[DBTABLE] WHERE [Timestamp] Between '2015-09-22 16:57:11.150' AND '2015-09-22 17:00:06.151'

Open xxxx

DECLARE @uebergabe float
Fetch next from xxxx into @uebergabe

while @@FETCH_STATUS = 0
DECLARE @test float = 0

Begin

SET @test =+ @uebergabe
fetch next from xxxx into @uebergabe
end
close xxxx


select @test


Vielen Dank für eure Hilfe
nutzloser-user


UPDATE:

HI,
ich habe den Code mal ausprobiert, aber leider macht er noch nicht genau das was er sollte. Ich versuche jetzt einen anderen Weg. Ich möchte zunächst alle Werte eines bestimmten Zeitfensters eines Produktes ausgeben. Ich habe dazu mal ein "SQL" geschrieben. Leider habe ich dort den Fehler, das wenn ich versuche die Variable "TEST" mit der Unterabfrage zu füllen, das ich einen NULL Wert erhalte. Wenn ich das Datum in der Unterabfrage direkt eingebe, erhalte ich Werte. Wo liegt der Fehler?

Content-Key: 284208

Url: https://administrator.de/contentid/284208

Printed on: April 19, 2024 at 18:04 o'clock

Member: ukulele-7
ukulele-7 Sep 30, 2015 updated at 07:14:37 (UTC)
Goto Top
Ich würde auf Cursor verzichten wo es geht. In diesem Fall würde ich mit CTE eine Rastertabelle erzeugen und darauf deine Daten joinen und gruppieren.
WITH raster(zeit_von,zeit_bis) AS (
SELECT	cast('00:00' AS TIME),  
		cast('00:14:59.9999999' AS TIME)  
UNION ALL
SELECT	dateadd(mi,15,zeit_von),
		dateadd(mi,15,zeit_bis)
FROM	raster
WHERE	zeit_von <= cast('23:30' AS TIME)  
)
SELECT	r.zeit_von,
		r.zeit_bis,
		t.Wert,
		sum(t.Wert) AS anzahl
FROM	raster r
LEFT JOIN Daten t
ON		cast(t.Zeit AS TIME) BETWEEN r.zeit_von AND r.zeit_bis
GROUP BY r.zeit_von,r.zeit_bis,t.Wert
OPTION (MAXRECURSION 100)

PS: Das Raster brauchst du eigentlich auch nur wenn du anzahl 0 in einem Interval abbilden willst. Ansonsten reicht auch ein völlig banales GROUP BY.
Member: ukulele-7
Solution ukulele-7 Sep 30, 2015, updated at Oct 06, 2015 at 09:34:32 (UTC)
Goto Top
Hier mal das ganz banale GROUP BY. Das einzig knifflige ist es, das komplette Datum mit Zeit auf einen Stundeninterval oder ähnliches runter zu brechen. (Und dann am besten auch noch so, das es sowohl mit englischem als auch mit deutschem Datumsformat läuft.)
SELECT	t.Anfangszeit,
		t.Anfangszeit + cast(cast('00:59:59.9999999' AS TIME) AS DATETIME) AS Endzeit,  
		t.Artikelnummer,
		t.Anzahl
FROM	(

SELECT	cast(cast(Zeit AS DATE) AS DATETIME) + cast(left(cast(Zeit AS TIME),2)+':00:00.000' AS DATETIME) AS Anfangszeit,  
		Artikelnummer,
		sum(Wert) AS Anzahl
FROM	Daten
GROUP BY cast(cast(Zeit AS DATE) AS DATETIME) + cast(left(cast(Zeit AS TIME),2)+':00:00.000' AS DATETIME),Artikelnummer  

		) t
Member: nutzloser-user
nutzloser-user Sep 30, 2015 at 07:42:27 (UTC)
Goto Top
Hallo ukulele-7,

vielen Dank für die schnelle Antwort. Ich werde es später einmal probieren.