2012-06-04 161 views
0

我有一个SQL查询,我无法正常工作SQL查询返回日期范围或所有记录或只有空记录

这是查询的简化版本。

select * from Permit 
inner join BMP on Permit.PermitNumber = BMP.PermitNumber 
left join BMPInspection as BI on Permit.PermitNumber = BI.PermitNumber and BMP.BMPNumber = BI.BMPNumber 

where Permit.PermitNumber = 'S002552' 
AND ((@StartDate IS NULL 
      AND @EndDate IS NULL) 
      OR (BI.dtActionDate > Dateadd(day, -1, @StartDate) 
       AND BI.dtActionDate < Dateadd(day, 1, @EndDate)) 
      OR (BI.dtActionDate > Dateadd(day, -1, @StartDate) 
       AND @EndDate IS NULL) 
      OR (@StartDate IS NULL 
       AND BI.dtActionDate < Dateadd(day, 1, @EndDate))) 

的期望的行为是

  1. 返回仅在当开始日期和结束日期被指定于结束日期
  2. 返回NULL日期或更小的时间范围记录时的开始日期是NULL和端日期有一个日期
  3. 返回NULL或大于开始日期当开始日期有一个日期和结束日期为空
  4. 返回只有开始日期和en d日期为空

现在我可以得到的是日期范围或所有记录NULLS和有效日期。

回答

0

对于这种情况:

返回只有当两个开始日期和结束日期 是一个NULL日期记录NULL

变化:

(@StartDate IS NULL AND @EndDate IS NULL) 

(@StartDate IS NULL AND @EndDate IS NULL AND BI.dtActionDate IS NULL) 
+0

Duh,我一直盯着这个四个多小时。非常感谢。 –

+0

并且通过扩展将'code'OR BI.dtActionDate添加到其他短语的NULL将满足其他条件 –

相关问题