具有多个条件的SQL查询日期

时间:2013-11-21 05:11:28

标签: sql sql-server datetime

我想在下表的日期写一个带条件的查询,有时需要很好的思考。

StartDtm                             StopDtm
2013-11-03 00:00:00.000               NULL
2013-11-05 08:00:00.000               NULL
2013-11-18 09:00:00.000               NULL
2013-11-18 08:00:00.000               NULL
2013-11-19 08:00:00.000              2013-11-26 07:59:00.000
2013-11-20 08:00:00.000              2013-11-27 07:59:00.000
2013-11-19 08:00:00.000              2013-12-19 07:59:00.000

该表显示任务开始日期和任务结束日期。开始日期永远不能为空。 最后一条记录显示该任务从11月19日开始,并将于12月19日结束。因此,如果我通过任何日期,它应该显示在通过日期范围之间的任何日期需要执行的所有任务。

条件如下:

1.任何日期或两个日期参数可以为空。如果是这样,所有数据都应该来。

2.如果@StartDtm为null并且传递了@StopDtm,那么它应该仅基于StopDtm字段提供所有数据,但是它不应该带来那些StartDtm大于@StopDtm的数据。 @StopDtm参数相同

3.如果StopDtm字段为空,则应仅基于StartDtm字段显示所有数据

我尝试了一些方法,但没有成功。我要保持条件尽可能短。如果可能的话,请提供多个查询,但几乎没有解释。

我的查询如下:

DECLARE @StartDtm datetime='2013-11-15'
DECLARE @StopDtm datetime='2013-11-21'

select * from #TempTbl
where  ((StartDtm<=@StartDtm OR @StartDtm IS NULL)  AND (StopDtm>=@StopDtm OR StopDtm IS NULL))
    OR((StartDtm>=@StartDtm OR @StartDtm IS NULL) AND (StopDtm>=@StopDtm AND StartDtm<= @StopDtm OR StopDtm IS NULL OR @StopDtm IS NULL))
    OR((StartDtm>=@StartDtm OR @StartDtm IS NULL) AND (StopDtm<=@StopDtm OR StopDtm IS NULL OR @StopDtm IS NULL))

提前致谢.. StackOverflow中已经提出了这个问题,但我找不到如何在此处迁移它。所以再次问到这里。

创建了另一个似乎正常运行的查询:

DECLARE @StartDtm datetime='2013-11-20'
DECLARE @StopDtm datetime='2013-11-30'

IF(@StartDtm is null)
begin
    SET @StartDtm='1900-01-01'
end
IF(@StopDtm IS NULL)
begin
    SET @StopDtm='9999-12-31'
end

select * from #TempTbl
where (startDtm<= @StartDtm and ISNULL(StopDtm,@StopDtm)>=@StopDtm )
  OR(StartDtm>=@StartDtm and ISNULL(StopDtm,@StopDtm)<=@StopDtm )
  OR(StartDtm between @StartDtm AND @StopDtm and ISNULL(StopDtm,@StopDtm)>=@StopDtm  )
  OR(StartDtm<=@StartDtm AND ISNULL(StopDtm,@StopDtm) between @StartDtm AND  @StopDtm)

建议是否有任何逻辑错误/改变/改进。

2 个答案:

答案 0 :(得分:0)

确实

WHERE (StartDtm <= @StopDtm AND @StopDtm >= @StartDtm) OR (StartDtm >= @StartDtm AND StopDtm IS NULL) 

为你工作?

答案 1 :(得分:0)

试试这个

WHERE (@StartDtm IS NULL OR StartDtm = @StartDtm)
  AND (@StopDtm IS NULL OR StopDtm = @StopDtm)
  OR ( ISNULL(@StartDtm,@StopDtm) = NULL OR (StartDtm> @StartDtm AND StopDtm < @StopDtm ) )