Sql server 如果根据字段中的日期和值未找到所有记录,Sql将返回false

Sql server 如果根据字段中的日期和值未找到所有记录,Sql将返回false,sql-server,Sql Server,抱歉,如果这不是很清楚,但很难总结 表Holiday,其中有一个字段名为hDate 表TimeSheet包含tsDate,code 样本数据 Holiday 7/4/2012 12/24/2012 12/25/2012 12/26/2012 TimeSheet 12/27/2012,W 12/24/2012,H 12/25/2012,W 样本数据 Holiday 7/4/2012 12/24/2012 12/25/

抱歉,如果这不是很清楚,但很难总结

Holiday
,其中有一个字段名为
hDate
TimeSheet
包含
tsDate,code

样本数据

   Holiday
   7/4/2012
   12/24/2012
   12/25/2012
   12/26/2012
   TimeSheet
   12/27/2012,W
   12/24/2012,H
   12/25/2012,W
样本数据

   Holiday
   7/4/2012
   12/24/2012
   12/25/2012
   12/26/2012
   TimeSheet
   12/27/2012,W
   12/24/2012,H
   12/25/2012,W
我需要根据日期范围验证假日表中日期范围之间的每条记录是否存在于时间表表中,并且它们是否为代码输入了H值


因此,如果传入的日期范围为12/24-12/30,则结果应为空,因为12/26的时间表中不存在任何数据,12/25的代码为W。因此,基本上我需要一个exists查询来执行此操作,您可以尝试以下SQL。它从左侧外部联接计算代码“H”和tsDate=null的数量。如果计数>0,则返回false

DECLARE @Holiday TABLE
(
    hDate DATETIME NOT NULL
)

DECLARE @TimeSheet TABLE
(
    tsDate DATETIME, 
    Code NCHAR(1)
)

INSERT INTO @Holiday (hDate)
VALUES ('2012-07-04'), ('2012-12-24'), ('2012-12-25'), ('2012-12-26')

INSERT INTO @TimeSheet (tsDate, Code)
VALUES ('2012-12-27', 'W'), ('2012-12-24', 'H'), ('2012-12-25', 'W')

DECLARE @StartDate DATETIME = '2012-12-24'
DECLARE @EndDate DATETIME = '2012-12-30'

SELECT 
    CASE WHEN COUNT(1) = 0 THEN 'TRUE' ELSE 'FALSE' END AS 'BooleanResult'
FROM
    (
        SELECT hDate 
        FROM @Holiday 
        WHERE hDate BETWEEN @StartDate AND @EndDate
    ) H 
    LEFT JOIN @TimeSheet TS
    ON TS.tsDate = H.hDate
WHERE 
    TS.Code != 'H' OR TS.tsDate IS NULL and 'H' not in (select doecode from timesheet 
where timesheet.tsdate = TS.tsDate

您能否提供一个返回结果的示例?根据您的问题和样本数据,我认为12/26需要标记为时间表中缺失,12/25需要H。如果时间表中缺少或包含日期,并且没有H.几乎完美。我之前应该提到过这一点,但是你每天可以有超过1个条目,所以如果有人有12/25的2个条目,1个带有H,另一个带有W,它应该返回true,但返回false