0

我需要根据以下几点获取一组记录:

  1. 如果 ( startdateandendate不为 null 则opendate应该在startdatean之间d enddate) 或 (closedate应该在startdateand之间enddate)
  2. 如果startdate不为空且enddate为空则opendate = startdate
  3. 如果startdate为空enddate且不为空,则closedate = enddate
  4. 如果两者都startdateenddate空,那么它应该检索所有数据

我使用下面的查询尝试了这个,但它只满足第 2 点到第 4 点。

Select * From CheckDateValues C
Where 
1 = 1 and

C.OPenDate >= Case 
             When (@OpenDate IS NULL) THEN C.OpenDate Else @OpenDate
             End
and 
C.CloseDate <= Case 
          When (@CloseDate IS NULL) THEN C.CloseDate Else @CloseDate
          End 

我不确定如何编写查询以使第 1 点也能正常工作。

4

1 回答 1

0

我认为您正在尝试确定两个范围之间的某种形式的重叠 - 一个在表格列中,另一个在您的变量中。如果是这样,我会给你我通常的重叠测试:

Select * From CheckDateValues C
where C.OpenDate <= COALESCE(@CloseDate,C.CloseDate) and
COALESCE(@OpenDate,C.OpenDate) <= C.CloseDate

其中(COALESCE用于消除NULL变量中的值)归结为:

两个时期重叠,如果:

  • 第1 期的开始在第 2 期结束之前,并且
  • 第 2 期的开始在第 1 期的结束之前。

这是一个比大多数人通常想出的简单得多的定义,并且避免了列举大量案例。

于 2013-06-12T06:47:40.463 回答