mrunze
Goto Top

Keine Datensätze in einem Zeitraum MSSQL 2005

Hallo,

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?!

Content-Key: 126143

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

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

Member: filippg
filippg Sep 30, 2009 at 15:55:54 (UTC)
Goto Top
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
Member: Logan000
Logan000 Oct 01, 2009 at 06:46:57 (UTC)
Goto Top
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.
Select * from Aktivitaeten Where Aktivitaeten.datum not between getdate()  and dateadd(d,-7,getdate()) 
Du must halt noch die Vorgäge und Adressen verknüpfen.

Gruß L.
Member: mrunze
mrunze Oct 01, 2009 at 12:48:54 (UTC)
Goto Top
Mein bisheriger Ansatz war wie folgt:

SELECT     dbo.Vorgaenge.Betreff AS VorBetreff, dbo.Adressen.Name AS AdrName, dbo.Vorgaenge.ID AS VorID, dbo.Adressen.ID AS AdrID
FROM         dbo.Vorgaenge INNER JOIN
                      dbo.Adressen ON dbo.Vorgaenge.AdressID = dbo.Adressen.ID
WHERE     (dbo.Vorgaenge.ID NOT IN
                          (SELECT     VorgangID
                            FROM          dbo.Aktivitaeten AS Aktivitaeten_1))

und

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)))


Vielen Dank für deinen Tipp, ich glaube das wars!
Nur was ist, wenn es zu einem Vorgang garkeine Aktivitäten gibt/gab?
Member: filippg
filippg Oct 01, 2009 at 13:01:10 (UTC)
Goto Top
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.
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
Member: Biber
Biber Oct 01, 2009 at 18:41:39 (UTC)
Goto Top
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:
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)))
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
Member: mrunze
mrunze Oct 01, 2009 at 19:17:42 (UTC)
Goto Top
Nein ich tauche nicht ab, ich mag konstruktive Kritik.

Ich nehm dir jetzt auch nicht übel, dass du dich aufregst, du kennst die Hintergründe ja nicht.

Das sogenannte Datenmodell stammt von einer Software mit der ich/wir leider arbeiten müssen. Ich habe ein wenig rumgespiel wie ich am besten an die geforderten Datensätze komme und das ist dabei rausgekommen, ich habe mir selber gedacht, dass das ganze doch auch einfacher/performater zu lösen ist, deshalb habe ich mich hier an dieses Forum gewandt face-smile

Schönen Abend noch