我有两个表:
和
我需要获取任何给定应用程序名称的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上,因此没有日期类型,因此我必须将其转换)
但是,即使今天是假期,它仍在返回记录。如何使用“not in”或“except”子句(或其他内容)构造此查询,以仅在今天不是假期的情况下返回记录?
更新
我不需要所有没有假期的应用程序名称的列表-我需要指定的apps.applicationname的记录。以下答案仅返回今天没有假期的应用程序名称。如果不是假期,则查询应返回isavailable标志,否则,则不返回任何记录。我不在乎其他应用程序。
另外,如果我添加了一个表,该怎么办:
我可以在所有这三个表中结合起来,以便仅在给定日期的小时内且不是假期的情况下才返回记录吗?我是否必须在单独的查询中执行此操作?
最佳答案
以下查询将为您提供没有为当前日期定义假期的应用程序列表。
SELECT apps.ApplicationName, apps.isavailable
FROM dbo.Applications apps
WHERE apps.ApplicationName = @AppName
AND NOT EXISTS
( SELECT *
FROM Holidays
WHERE ApplicationId = apps.ApplicationId
AND CONVERT(VARCHAR,getdate(),101) = CONVERT(VARCHAR,holidaydate,101)
)
基本上,我们要做的是选择没有匹配项的所有内容。
关于如果查询与另一个表中的条目匹配(例如假期),则执行SQL查询以排除记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/711644/