Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
筛选SQL行_Sql_Sql Server 2005_Tsql - Fatal编程技术网

筛选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的条目。