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?
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.
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.
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.
Tags und Links sql sql-server-2005 join