Keine Datensätze in einem Zeitraum MSSQL 2005
Hallo,
ich habe 3 Datenbanktabellen, die wie folgt aufgebaut sind:
Mein Problem besteht jetzt darin, dass ich alle Vorgänge bzw. Adressen haben möchte, wozu es in den letzten 7 Tagen keine Aktivität gegeben hat.
Ich bekomme es soweit hin, dass ich die Vorgänge und Aktivitäten angezeigt bekomme wozu es garkeine Aktivität gegeben hat und alle Aktivitäten in der letzten Woche, aber ich stecke jetzt irgendwie fest.
Ich hoffe ich stehe nur aufm Schlauch?!
ich habe 3 Datenbanktabellen, die wie folgt aufgebaut sind:
Adressen | Vorgaenge | Aktivitaeten |
---|---|---|
ID | ID | ID |
AdressID | VorgangID | |
AdressID | ||
Name | Betreff | Betreff |
Datum | Datum |
Mein Problem besteht jetzt darin, dass ich alle Vorgänge bzw. Adressen haben möchte, wozu es in den letzten 7 Tagen keine Aktivität gegeben hat.
Ich bekomme es soweit hin, dass ich die Vorgänge und Aktivitäten angezeigt bekomme wozu es garkeine Aktivität gegeben hat und alle Aktivitäten in der letzten Woche, aber ich stecke jetzt irgendwie fest.
Ich hoffe ich stehe nur aufm Schlauch?!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 126143
Url: https://administrator.de/forum/keine-datensaetze-in-einem-zeitraum-mssql-2005-126143.html
Ausgedruckt am: 15.05.2025 um 04:05 Uhr
6 Kommentare
Neuester Kommentar
Hallo,
Wenn man schon eine halbe Lösung hat ist es oft nicht verkehrt, diese einfach mal zu posten.
mein Ansatz wäre etwas wie
SELECT * FROM Adressen WHERE ID NOT IN (SELECT AdressID FROM Aktivitaeten WHERE Datum > gesternVorEinerWoche)
Also prüfen, wer alles aktuelle Vorgänge hat, und dann alle selektieren, die in dieser Liste nicht enthalten sind.
Knackpunkt ist natürlich "WHERE Datum > gesternVorEinerWoche". gesternVorEinerWoche muss durch einen geeigneten Wert ersetzt werden. Unter MSSQL gibt es dazu glaube ich die DATEDIFF-Funktion. Schau halt mal in der Doku zu Datums/Zeitfunktionen.
Für Syntax übernehme ich grundsätzlich keine Haftung.
Gruß
Filipp
Wenn man schon eine halbe Lösung hat ist es oft nicht verkehrt, diese einfach mal zu posten.
mein Ansatz wäre etwas wie
SELECT * FROM Adressen WHERE ID NOT IN (SELECT AdressID FROM Aktivitaeten WHERE Datum > gesternVorEinerWoche)
Also prüfen, wer alles aktuelle Vorgänge hat, und dann alle selektieren, die in dieser Liste nicht enthalten sind.
Knackpunkt ist natürlich "WHERE Datum > gesternVorEinerWoche". gesternVorEinerWoche muss durch einen geeigneten Wert ersetzt werden. Unter MSSQL gibt es dazu glaube ich die DATEDIFF-Funktion. Schau halt mal in der Doku zu Datums/Zeitfunktionen.
Für Syntax übernehme ich grundsätzlich keine Haftung.
Gruß
Filipp
Moin moin
Für datums vergleiche eignet sich hier between.
Damit solltes Du alle Aktivitäten erhalten die keinen Eintrag in den letzen 7 tagen haben.
Du must halt noch die Vorgäge und Adressen verknüpfen.
Gruß L.
Für datums vergleiche eignet sich hier between.
Damit solltes Du alle Aktivitäten erhalten die keinen Eintrag in den letzen 7 tagen haben.
Select * from Aktivitaeten Where Aktivitaeten.datum not between getdate() and dateadd(d,-7,getdate())
Gruß L.
Nur was ist, wenn es zu einem Vorgang garkeine Aktivitäten
gibt/gab?
Der von mir genannte Ansatz gibt auch diese aus (bzw die Adressen, für Vorgänge kannst du das ja analog ändern). Die von dir geposteten Ansätze tun das nicht. Grund ist das INNER JOIN. Das sorgt dafür, dass nur Zeilen ausgegeben werden, für die ein Join gefunden wird. Ein LEFT JOIN würde das Problem lösen, der nimmt alle Zeilen der ersten Tabelle mit auf. Allerdings kann das dann mit der WHERE-Klausel etwas tricky sein: diese prüft ja auf Werte aus der rechten Tabelle, die dann den Wert NULL haben - und Vergleiche mit NULL können zu unerwarteten Eregebnissen führen.gibt/gab?
Ich kann dir http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/index.htm allerwärmstens empfehlen. Hat man schnell mal durchgearbeitet und hat danach wirklich mehr Durchblick.
Gruß
Filipp
Moin mrunze,
willkommen im Forum.
ich weiss ja nicht, ob du hier schon länger mitliest im Forum - falls nicht:
Hier bekommst du gelegentlich auch Antworten auf Fragen,die du gar nicht gestellt hattest.
Ist aber meistens konstruktiv gemeint, also bitte nicht gleich abtauchen.
a) zu Deinem "..aber ich stecke jetzt irgendwie fest" ...
ja hey! Wenn bei euch typische SQL-Statements nach nur 6 Zeilen so aussehen:
menno, wie willst du das denn lesen/überblicken/warten/optimieren können???
Das sieht doch aus wie auf dem Hof zusammengekehrt.
Kannst Du den Gedanken an dich heranlassen, dass solche Angewohnheiten möglicherweise tatsächlich vorhandene Probleme vorgaukeln?
b) insbesondere auf die Palme bringt mich euer lustigesDatumsfeld... ist bestimmt auch NULLABLE, ungeprüft, aber bei der ersten Anfrage, der ersten interessanten Fragestellung kommt hoch, dass natürlich alle wissen wollen, welche Aktivitäten und Vorgänge denn mit einer Millisekundengenauigkeit (Style 121) denn in den letzten 7 Tagen oder umgerechnet den letzten 7*84000*100 Millisekunden abgegangen sind.
Da ganze dann noch mit einem sau-performanten "WHERE (NOT (convert(bla) BETWENN (dateadd(Convert(blubb) AND Convert(blabb)" ...da geht richtig die Luzie ab.
WozuTF wollt ihr denn nur die Vorgänge und Aktivitäten "Bis heute" haben?
Wie viele sind denn drin, die übernächsten Montag stattgefunden haben??
Wenn das jetzt die ersten Querys mit einem noch nicht In-Entwicklung-befindlichen Datenmodell sind - dann steckt JETZT mehr Aufwand in das Design und nicht jetzt schon in kunstvoll SQL-Verschraubungen.
Grüße
Biber
willkommen im Forum.
ich weiss ja nicht, ob du hier schon länger mitliest im Forum - falls nicht:
Hier bekommst du gelegentlich auch Antworten auf Fragen,die du gar nicht gestellt hattest.
Ist aber meistens konstruktiv gemeint, also bitte nicht gleich abtauchen.
a) zu Deinem "..aber ich stecke jetzt irgendwie fest" ...
ja hey! Wenn bei euch typische SQL-Statements nach nur 6 Zeilen so aussehen:
SELECT dbo.Vorgaenge.Betreff AS VorBetreff, dbo.Adressen.Name AS AdrName, CONVERT(datetime, dbo.Aktivitaeten.Datum, 121) AS Expr1,
dbo.Aktivitaeten.Betreff AS AktBetreff, dbo.Aktivitaeten.Datum AS AktDatum, dbo.Vorgaenge.ID AS VorID, dbo.Adressen.ID AS AdrID, dbo.Aktivitaeten.ID AS AktID
FROM dbo.Vorgaenge INNER JOIN
dbo.Adressen ON dbo.Vorgaenge.AdressID = dbo.Adressen.ID INNER JOIN
dbo.Aktivitaeten ON dbo.Vorgaenge.ID = dbo.Aktivitaeten.VorgangID
WHERE (NOT (CONVERT(datetime, dbo.Aktivitaeten.Datum, 121) BETWEEN DATEADD(dd, - 7, CONVERT(datetime, GETDATE(), 121)) AND CONVERT(datetime, GETDATE(), 121)))
Das sieht doch aus wie auf dem Hof zusammengekehrt.
Kannst Du den Gedanken an dich heranlassen, dass solche Angewohnheiten möglicherweise tatsächlich vorhandene Probleme vorgaukeln?
b) insbesondere auf die Palme bringt mich euer lustigesDatumsfeld... ist bestimmt auch NULLABLE, ungeprüft, aber bei der ersten Anfrage, der ersten interessanten Fragestellung kommt hoch, dass natürlich alle wissen wollen, welche Aktivitäten und Vorgänge denn mit einer Millisekundengenauigkeit (Style 121) denn in den letzten 7 Tagen oder umgerechnet den letzten 7*84000*100 Millisekunden abgegangen sind.
Da ganze dann noch mit einem sau-performanten "WHERE (NOT (convert(bla) BETWENN (dateadd(Convert(blubb) AND Convert(blabb)" ...da geht richtig die Luzie ab.
WozuTF wollt ihr denn nur die Vorgänge und Aktivitäten "Bis heute" haben?
Wie viele sind denn drin, die übernächsten Montag stattgefunden haben??
Wenn das jetzt die ersten Querys mit einem noch nicht In-Entwicklung-befindlichen Datenmodell sind - dann steckt JETZT mehr Aufwand in das Design und nicht jetzt schon in kunstvoll SQL-Verschraubungen.
Grüße
Biber