我想在下表的日期写一个带条件的查询,有时需要很好的思考。
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)
建议是否有任何逻辑错误/改变/改进。
答案 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 ) )