Requête SQL pour exclure les enregistrements si elle correspond à une entrée dans une autre table (par exemple des dates de vacances)

J'ai deux tables:

Application

identificateur applicationid (int)

applicationname (varchar)

isavailable (bit)

et

Vacances

identificateur applicationid (int)

holidaydate (datetime)

J'ai besoin d'obtenir le isavailable drapeau pour tout applicationname mais il devrait retourner uniquement si le jour s'est pas un jour férié. Le isavailable drapeau est indépendante de vacances - c'est seulement si il y a des problèmes au niveau du système, et non pas sur un programme défini.

J'ai d'abord eu quelque chose comme:

select top 1 apps.isavailable
from dbo.Applications apps, dbo.Holidays hol
where apps.applicationid = hol.applicationid and
      apps.applicationname = @appname and
      ((datediff(dd,getdate(),hol.holidaydate)) != 0)

mais c'était le retour des dossiers, même si aujourd'hui était un jour férié parce que les autres dates de vacances ne correspond pas aujourd'hui.

J'ai essayé

and (CONVERT(VARCHAR,getdate(),101)) not in (CONVERT(VARCHAR,hol.holidaydate,101))

(c'est sur SQL Server 2005, donc il n'y a pas de type Date, donc je dois les convertir)

mais encore une fois, il était de retour des dossiers, même si aujourd'hui était un jour férié. Comment structurer cette requête à l'aide d'un "non" ou "à l'exception de" l'alinéa (ou autre chose) à retourner uniquement si aujourd'hui n'est pas un jour férié?

Mise à jour

Je n'ai pas besoin d'une liste de tous les applicationnames qui n'ont pas de vacances - j'ai besoin d'un dossier pour l'apps.applicationname. Les réponses ci-dessous retourner uniquement les noms des applications qui n'ont pas de vacances aujourd'hui. La requête doit renvoyer la isavailable flag si ce n'est pas un jour férié, ou de restitution aucun enregistrement si elle est un jour férié. Je ne me préoccupe pas des autres applications.

Aussi, que si j'ai ajouté une table:

HoursOfOperations

identificateur applicationid (int)

mondayopen (datetime)

mondayclose (datetime)

tuesdayopen (datetime)

tuesdayclose (datetime)

//ouvrir et à fermer toutes les sept jours de la semaine

Pourrais-je rejoindre sur chacun de ces trois tables à retourner uniquement si c'est dans les heures de la journée et n'est pas un jour férié? Dois-je le faire dans les requêtes distinctes?

OriginalL'auteur Tai Squared | 2009-04-02