![]() |
Datenbank: MSSQL Server • Version: 2008 R2 • Zugriff über: Management Studio
MSSQL Schleife ueber einen gewissen Zeitraum
Moin DP!,
Ich habe in diesem ![]() Gluecklicherweise habe ich nun direkten Zugriff auf die Datenbank bekommen und koennte das Problem direkt bei der Wurzel packen. Ich kenne mich mit der MSSQL Scriptsprache leider nicht aus, es reicht lediglich fuer einfache select- oder insert Anweisungen. Mit diesem einfachen select statement bekomme ich die Ergebnisse fuer den 1. Januar 2012 zurueck:
Code:
SELECT * FROM tabelle WHERE lappenID=2 AND zeitraum BETWEEN '2012-01-01 00:00:00' AND '2012-01-01 23:59:59'
Code:
Wenn mehr als 0 Zeilen zurueckkommen, dann sind fuer den 1. Januar Eintraege vorhanden. Wenn ich jetzt die Abfrage ueber den ganzen Januar (also 31 Tage) laufen lasse, bekomme ich jede Menge Ergebnisse. Ich weiss aber nicht, an welchen der 31 Tage kein Eintrag vorhanden ist!
SELECT @@ROWCOUNT
Fuer die 31 Tage im Januar muesste ich das obige statement 31 mal ausfuehren und immer den zeitraum anpassen. Kommt an einem der Tage 0 Zeilen zurueck, hat dieser Tag keinen Eintrag. Mit welcher Kontrollstruktur kann ich den Zeitraum variabel auf Anzahl der Zeilen abfragen? |
AW: MSSQL Schleife ueber einen gewissen Zeitraum
Falls du auch Zugriff auf eine Datumstabelle haben solltest, würde sich vielleicht ein ähnliches Konstrukt wie folgendes anbieten:
Code:
SELECT d.Datum FROM
(SELECT Datum from Datumstabelle WHERE year(Datum) = 2012 AND month(Datum) = 1) d LEFT OUTER JOIN (SELECT Zeitraum FROM tabelle WHERE lappenID = 2 AND year(Zeitraum) = 2012 AND month(Zeitraum) = 1 GROUP BY Zeitraum) t ON d.Datum = t.Zeitraum WHERE t.Datum is null Bzw. wenn die Anzahl der Zeilen pro Datum (bei Tagen mit Daten) auch noch wichtig sein sollte:
Code:
SELECT d.Datum, b.Anz FROM
(SELECT Datum from Datumstabelle WHERE year(Datum) = 2012 AND month(Datum) = 1) d LEFT OUTER JOIN (SELECT Zeitraum, count(*) AS Anz FROM tabelle WHERE lappenID = 2 AND year(Zeitraum) = 2012 AND month(Zeitraum) = 1 GROUP BY Zeitraum) t ON d.Datum = t.Zeitraum |
AW: MSSQL Schleife ueber einen gewissen Zeitraum
Hattest Du nicht gesagt Delphi?
Lutsch Dir doch den Monat rein und schau mit der For-Schleife das Ergebniss an! Oder hab ich da etwas nicht verstanden? Grüsse Mavarik |
AW: MSSQL Schleife ueber einen gewissen Zeitraum
Vielleicht so...
SQL-Code:
DECLARE @t INT
DECLARE @m INT DECLARE @j INT DECLARE @minj INT DECLARE @maxj INT DECLARE @tag TABLE ( tag INT ) DECLARE @monat TABLE ( monat INT ) DECLARE @jahr TABLE ( jahr INT ) SET @t = 1 WHILE @t <= 31 BEGIN INSERT INTO @tag VALUES (@t) SET @t = @t + 1 END SET @m = 1 WHILE @m <= 12 BEGIN INSERT INTO @monat VALUES (@m) SET @m = @m + 1 END SELECT @minj = MIN(YEAR(datum)), @maxj = MAX(YEAR(datum)) FROM tabelle SET @j = @minj WHILE @j <= @maxj BEGIN INSERT INTO @jahr VALUES (@j) SET @j = @j + 1 END SELECT * FROM (SELECT * FROM (SELECT *, DAY(DATEADD(d, -1, DATEADD(m, 1, CONVERT(DATETIME, '01.' + CONVERT(VARCHAR, monat) + '.' + CONVERT(VARCHAR, jahr))))) maxtage FROM @jahr, @monat) x, @tag, (SELECT DISTINCT lappenid FROM tabelle) y WHERE tag <= maxtage) x WHERE NOT EXISTS (SELECT * FROM tabelle WHERE DAY(datum) = x.tag AND MONTH(datum) = x.monat AND YEAR(datum) = x.jahr AND lappenid = x.lappenid) ORDER BY jahr, monat, tag |
AW: MSSQL Schleife ueber einen gewissen Zeitraum
Folgende Anfrage liefert alle "Datümer" (ich weiss das die Mehrzahl von Datum Daten ist) und die Anzahl der Datensätze:
SQL-Code:
SELECT CONVERT(char(8), Zeitraum, 112) AS Datum, Count(*) AS Anzahl
FROM tabelle GROUP BY CONVERT(char(8), Zeitraum, 112) ORDER BY 1 |
AW: MSSQL Schleife ueber einen gewissen Zeitraum
Zitat:
Gruß K-H |
AW: MSSQL Schleife ueber einen gewissen Zeitraum
Danke fuer die vielen inspirierenden Antworten!
Ich habe mir jetzt eine Loesung zusammengebaut, welche das gewuenschte Ergebnis liefert: Die Tage ohne Eintragung ueber einen gewissen Zeitraum! So siehts aus:
SQL-Code:
Im Prinzip ganz einfach:
DECLARE @begindate DATETIME
DECLARE @begindate_end DATETIME DECLARE @enddate DATETIME DECLARE @i INT DECLARE @diffdays INT SET @i = 1 SET @begindate='2011-01-01 00:00:00' SET @enddate='2012-02-17 23:59:59' SET @diffdays=DATEDIFF(DAY, @begindate, @enddate) WHILE (@i <= @diffdays+1) BEGIN SET @begindate_end = DATEADD(HOUR,23,@begindate) SET @begindate_end = DATEADD(MINUTE,59,@begindate_end) IF NOT EXISTS ( SELECT [telefonate]FROM [ABC].[dbo].[t_telefonate] WHERE LappenID = 2 AND FirstTime BETWEEN @begindate AND @begindate_end) BEGIN PRINT '*** Row NOT found between:' PRINT @begindate PRINT @begindate_end PRINT '----------------------------' END SET @begindate = DATEADD(DAY,1,@begindate) SET @i = @i + 1 END - Den Zeitraum bestimmen - Differenz in Tagen ermitteln - Schleife ueber den Zeitraum - Den Tag von 0 Uhr bis 23:59 pruefen, kommt nix zurueck existiert kein Eintrag fuer den Tag - Tagescounter hochzaehlen Bestimmt unter aller Sau, funktioniert aber erstmal :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz