SQL-Abfrage zum Ausschließen von Datensätzen, wenn sie mit einem Eintrag in einer anderen Tabelle übereinstimmt (z. B. Ferientermine)

7

Ich habe zwei Tabellen:

  

Anwendung
  applicationid (int)
  Anwendungsname (varchar)
  isavailable (Bit)

und

  

Feiertage
  applicationid (int)
  Feiertagsdatum (Datetime)

Ich muss das Flag isavailable für einen bestimmten Anwendungsnamen abrufen, aber es sollte nur zurückgegeben werden, wenn der Tag if kein Feiertag ist. Das Flag isavailable ist unabhängig von Feiertagen - es wird nur gesetzt, wenn systemweite Probleme auftreten und nicht nach einem festgelegten Zeitplan.

Ich hatte ursprünglich etwas wie:

%Vor%

aber das war ein Rekord, selbst wenn heute ein Feiertag war, weil die anderen Feiertage nicht gleich heute sind.

Ich habe es versucht

%Vor%

(es ist auf SQL Server 2005, also gibt es keinen Datumstyp, also muss ich es umwandeln)

Aber wieder, es gab Aufzeichnungen, selbst wenn heute ein Feiertag war. Wie kann ich diese Abfrage mit einer "nicht in" - oder "außer" -Klausel (oder etwas anderem) strukturieren, um nur dann einen Datensatz zurückzugeben, wenn heute kein Feiertag ist?

Aktualisieren

Ich brauche keine Liste aller Anwendungsnamen, die keinen Feiertag haben - ich brauche einen Datensatz für den angegebenen apps.applicationname. Die folgenden Antworten geben nur die Anwendungsnamen zurück, für die heute kein Feiertag vorhanden ist. Die Abfrage sollte das Isavailable-Flag zurückgeben, wenn es sich nicht um einen Feiertag handelt, oder andernfalls keine Datensätze, wenn es sich um einen Feiertag handelt. Die anderen Anwendungen interessieren mich nicht.

Was auch, wenn ich eine Tabelle wie folgt hinzufüge:

  

StundenOffOperationen
  applicationid (int)
  montagopen (datetime)
  Montageschluss (Datetime)
  dienstagsoffen (datetime)
  Dienstageschliessen (Datetime)
  // öffne und schließe für alle sieben Tage der Woche

Kann ich an allen drei dieser Tische teilnehmen, um nur dann einen Eintrag zu erhalten, wenn er innerhalb der Stunden für den angegebenen Tag liegt und kein Feiertag ist? Muss ich dies in separaten Abfragen tun?

    
Tai Squared 02.04.2009, 21:09
quelle

6 Antworten

14

Die folgende Abfrage sollte Ihnen eine Liste der Anwendungen anzeigen, für die kein Feiertag für das aktuelle Datum definiert wurde.

%Vor%

Grundsätzlich wählen wir alles aus, wo es keine Übereinstimmung gibt.

    
Mitchel Sellers 02.04.2009, 21:19
quelle
5

OK, nur um anders zu sein, wie wäre es mit so etwas:

%Vor%

Grundsätzlich verknüpfen Sie die Tabellen basierend auf der Anwendungs-ID und dem aktuellen Datum. Da es sich um eine linke Verknüpfung handelt, erhalten Sie immer alle Anwendungen, die mit @AppName übereinstimmen. Dann filtern Sie einfach alle Ergebnisse aus, die eine Übereinstimmung basierend auf dem Urlaubsdatum als aktuellem Datum erhalten. Unter der Annahme, dass Anwendungsname eindeutig ist, erhalten Sie immer eine einzelne Zeile, in der die rechte Hälfte des Joins null ist, es sei denn, das aktuelle Datum entspricht einem Feiertag. In diesem Fall gibt die Abfrage keine Ergebnisse zurück.

Ich weiß nicht, wie es mit den anderen Lösungen leistungsmäßig zusammenhängt; Ich glaube, Joins sind im Allgemeinen schneller als Sub-Abfragen, aber das hängt wahrscheinlich von einer Vielzahl von Faktoren ab, also YMMV.

    
Matt 02.04.2009 22:15
quelle
4

Sie können "WHERE NOT EXISTS" verwenden:

%Vor%

Ich mache die Besetzung dort, um den Aufruf von getdate () auf das Datum zurückzuschneiden. Ich habe diese genaue Abfrage nicht getestet, aber ich denke, dass sie die Aufgabe für Sie erledigt.

    
Matt Hamilton 02.04.2009 21:16
quelle
2

Tun Sie etwas wie folgt:

%Vor%

Natürlich wäre es viel einfacher und schneller mit SQL Server 2008 "DATE" -Datentyp, oder wenn Sie Tag, Monat, Jahr in "Holidays" separat speichern könnten.

Marc

    
marc_s 02.04.2009 21:17
quelle
1
%Vor%     
Chase Seibert 02.04.2009 21:23
quelle
0

Was ist mit diesem:

%Vor%

"'app1'" sollte durch einen Variablenspezifizierer und "CurrentDate ()" durch die systemspezifische Funktion ersetzt werden, um das aktuelle Datum zurückzugeben.

Prost

/ a

    
alk 24.08.2011 10:13
quelle

Tags und Links