我有两个表:







我需要获取任何给定应用程序名称的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/

10-13 08:18