2010-02-02 56 views
3

表结构过滤SQL行

ID  Activate_Date    InActivate_Date 
1  2009-12-18 10:25:19.470 2010-01-13 08:32:30.130 
2  2009-12-18 10:25:19.470 2010-01-13 08:32:30.253 
3  2009-12-18 10:25:19.470 2010-01-13 08:32:30.363 
4  2009-12-18 10:25:19.470 2010-01-13 08:32:30.583 
5  2009-12-18 10:25:19.470 2010-01-13 08:32:30.473 
6  2010-01-13 14:46:53.880 2010-01-13 14:50:45.443 
7  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
8  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
9  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
10  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
11  2010-01-13 14:46:53.880 2010-01-13 14:50:45.443 
12  2010-01-13 14:44:56.397 2010-01-13 14:46:23.833 
13  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 
14  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 
15  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 
16  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 

输入参数:

Declare @StartDate DateTime 
Declare @EndDate DateTime 

Declare @FirstShiftStartTime varchar(8) 
Declare @FirstShiftEndTime varchar(8) 

Set @StartDate = '1/01/2010' 
Set @EndDate = '1/03/2010' 

SET @FirstShiftStartTime = '15:00:00' 
SET @FirstShiftEndTime = '17:00:00' 

输出:

输出应当是所有的行,使得时间过滤器应在每一天的形式施加转变。

1/01/2010 from 15:00:00 to 17:00:00 
2/02/2010 from 15:00:00 to 17:00:00 
3/03/2010 from 15:00:00 to 17:00:00 

我希望我已经作出了明确的自我:因此,如果我们使用这些参数则应该首先从ID 1 5行5

所以在输出过滤器应为应用了放

我试着使用:

((DatePart(Table.Activate_Date) <= @StartDate AND DatePart(Table.INActivate_Date) > @StartDate) OR 
    (DatePart(Table.Activate_Date) >= @StartDate AND DatePart(Table.InActivate_Date) < @EndDate) 
    ) 

AND ((TimePart(Table.Activate_Date) >[email protected]) AND (TimePart(Table.INActivate_Date) < @FirstShiftEndTime)) 

但这不会如果激活日期工作,灭活日期跨越多天。

我能找到的另一种方法是创建一个临时表,每天循环,然后用过滤器填充临时表,然后应用上述方法。

我希望应该有一些简单的东西,然后我在想。

任何帮助将不胜感激。

回答

0

最后,我创建了一个CTE包含日期时间过滤器的每一天输入日期范围,然后加入了CTE与表,并应用不同,以得到结果。

更新:对于简单的日期范围检查,请使用:

dr1.EndDate> = dr2.StartDate和dr1.StartDate < = dr2.EndDate

0

我不认为你可以分别考虑日期和时间。如果您想知道02/02/2010之间的1500和1700之间的活动状态,并且该行的活动日期为01/01,并且活动日期为03/03,则该活动在02/02,所以DB中的开始/结束时间不相关。

如果活动日期或非活动日期发生日期(02/02)然后您需要考虑时间。

我想你想是这样的伪代码:

(ActivateDate < @StartDate OR ( 
     ActivateDate = @StartDate And ActivateTime <= @ShiftStartTime) 
    ) 
and (InActivateDate > @EndDate OR ( 
     InActivateDate = @EndDate And InActivateTime >= @ShiftEndTime) 
    ) 
+0

MikeW感谢您的答复,但我需要时间切片在每一天。即,如果我们采用上述示例,则不应包含Activate_Date 1/02/2010 18:00:00与Inactive_Date 1/02/2010 20:00:00的条目。 – 2010-02-02 18:48:23