筛选SQL行
表模式筛选SQL行,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,表模式 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
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'
输出:
输出应该是所有的行,这样时间过滤器应该以轮班的形式应用于每天。因此,如果我们使用这些参数,那么输出应该是从ID1到ID5的前5行
因此,输出滤波器应按如下方式应用:
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
我希望我已经把自己说清楚了:
我尝试使用:
((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) >=@FirstShiftStartTime ) AND (TimePart(Table.INActivate_Date) < @FirstShiftEndTime))
((DatePart(Table.Activate_Date)@StartDate)或
(DatePart(Table.Activate_Date)>=@StartDate和DatePart(Table.Activate_Date)<@EndDate)
)
和((时间部分(表.Activate_Date)>=@FirstShiftStartTime)和(时间部分(表.Activate_Date)<@FirstShiftEndTime))
但如果激活日期和停用日期跨越多天,则此操作将不起作用
我可以找到的另一种方法是创建一个每天循环的临时表,然后用过滤器填充临时表,然后应用上述方法
我希望应该有一些简单的事情,然后我在想
如有任何帮助,将不胜感激。 < P>我不认为你可以单独考虑日期和时间。如果您想知道在2010年2月2日1500到1700之间的活动日期,并且该行的活动日期为01/01,非活动日期为03/03,则该行在02/02时全天处于活动状态,因此数据库中的开始/结束时间不相关
如果活动日期或不活动日期发生在所讨论的日期(02/02),则需要考虑时间。
我想您需要这样的伪代码: (ActivateDate < @StartDate OR (
ActivateDate = @StartDate And ActivateTime <= @ShiftStartTime )
)
and (InActivateDate > @EndDate OR (
InActivateDate = @EndDate And InActivateTime >= @ShiftEndTime )
)
(激活日期<@StartDate或(
ActivateDate=@StartDate和ActivateTime@EndDate或(
失活日期=@EndDate和失活时间>=@ShiftEndTime)
)
最后,我创建了一个CTE,其中包含输入日期范围内每天的DateTime筛选器,然后将该CTE与表合并并应用distinct以获得结果
更新:对于简单的日期范围检查,请使用:
dr1.EndDate>=dr2.StartDate和dr1.StartDate MikeW感谢您的回复,但我需要每天划分时间。即,如果我们以上面的示例为例,则不应包括激活日期为1/02/2010 18:00:00,非激活日期为1/02/2010 20:00:00的条目。