ho due tabelle:query SQL per escludere i record se corrisponde a una voce in un'altra tabella (come ad esempio le date delle vacanze)
applicazione
applicationID (int)
applicationname (varchar)
isavailable (bit)
e
Vacanze
ApplicationID (int)
holidaydate (datetime)
ho bisogno di ottenere il IsAvailable bandiera per ogni applicationname ma deve restituire solo se il giorno, se non è una vacanza. Il flag è disponibile flag è indipendente dalle festività - è impostato solo se esistono problemi a livello di sistema, non su una pianificazione impostata.
inizialmente ho avuto qualcosa di simile:
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)
ma che stava tornando record, anche se oggi è stata una vacanza perché le altre date delle vacanze non equivalgono oggi.
ho cercato
and (CONVERT(VARCHAR,getdate(),101)) not in (CONVERT(VARCHAR,hol.holidaydate,101))
(è su SQL Server 2005, quindi non c'è nessun tipo di Data quindi devo convertirlo)
ma ancora una volta, stava tornando record, anche se oggi è stata una vacanza. Come posso strutturare questa query usando una clausola "not in" o "except" (o qualcos'altro) per restituire un record solo se oggi non è una vacanza?
Aggiornamento
Non ho bisogno di un elenco di tutti applicationName che non hanno una vacanza - Ho bisogno di un record per l'apps.applicationname specificato. Le risposte qui sotto restituiscono solo i nomi delle applicazioni che non hanno una vacanza in data odierna. La query dovrebbe restituire il flag isavailable se non è una festività, oppure non restituire alcun record se si tratta di una festività. Non mi importa delle altre applicazioni.
Inoltre, cosa succede se ho aggiunto una tabella come:
HoursOfOperations
applicationID (int)
mondayopen (datetime)
mondayclose (datetime)
tuesdayopen (datetime)
tuesdayclose (datetime)
// apre e chiude per tutti i sette giorni della settimana
Posso partecipare a tutte e tre queste tabelle per restituire un record solo se è nelle ore del giorno indicato e non è una vacanza?Devo farlo in query separate?
Fornisce tutte le applicazioni che non hanno una festività definita, ma ho bisogno del flag isavailable per solo l'apps.applicationname specificata. Non voglio dover scorrere l'elenco dopo la query. Inoltre, cosa succede se devo unirmi a un altro tavolo? Non riesco a combinare la clausola where and where not –
Tai - basta aggiungere una clausola aggiuntiva. AND apps.AppName = 'la tua applicazione'. Puoi aggiungere tutti i join necessari, –
Ho aggiornato l'esempio per te per mostrarti come limitare il nome dell'app, assumendo un parametro di @AppName –