У меня есть две таблицы:
Применение
applicationid (int)
имя приложения (varchar)
доступно (бит)
и
Праздники
applicationid (int)
выходной день (дата / время)
Мне нужно получить флаг isavailable для любого заданного имени приложения, но он должен возвращаться только в том случае, если день не является выходным. Флаг isavailable не зависит от праздников - он устанавливается только в случае проблем в системе, а не по заданному расписанию.
У меня изначально было что-то вроде:
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)
но это возвращало записи, даже если сегодня был выходной, потому что другие даты выходных не совпадают сегодня.
Я пытался
and (CONVERT(VARCHAR,getdate(),101)) not in (CONVERT(VARCHAR,hol.holidaydate,101))
(это на SQL Server 2005, поэтому нет типа Date, поэтому я должен преобразовать его)
но опять же, он возвращал записи, даже если сегодня был выходной. Как я могу структурировать этот запрос, используя предложение «не в» или «кроме» (или что-то еще), чтобы вернуть запись, только если сегодня не выходной?
Обновление
Мне не нужен список всех имен приложений, у которых нет выходных - мне нужна запись для указанного apps.applicationname. Ответы ниже только возвращают названия приложений, на которые сегодня нет выходных. Запрос должен возвращать флаг isavailable, если это не выходной, или же не возвращать никаких записей, если это выходной. Меня не волнуют другие приложения.
Кроме того, что если я добавлю таблицу вроде:
HoursOfOperations
applicationid (int)
понедельникоткрыто (дата / время)
понедельникclose (дата / время)
вторник (дата / время)
вторникclose (дата / время)
// открываем и закрываем все семь дней недели
Могу ли я присоединиться ко всем трем из этих таблиц, чтобы вернуть запись, только если она находится в пределах часов для данного дня и не является выходным? Нужно ли делать это в отдельных запросах?