代码之家  ›  专栏  ›  技术社区  ›  Nitin Midha

筛选SQL行

  •  3
  • Nitin Midha  · 技术社区  · 15 年前

    表模式

    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'
    

    输出应该是所有的行,这样时间过滤器应该以轮班的形式应用于每天。如果我们应该使用5中的第一个ID,那么我们应该使用5中的第一个ID。

    因此,输出滤波器应按如下方式应用:

    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))
    

    但如果激活日期和停用日期跨越多天,则此操作将不起作用。

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

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

    我们将非常感谢您的帮助。

    2 回复  |  直到 15 年前
        1
  •  0
  •   MikeW    15 年前

    我认为你不能单独考虑日期和时间。如果您想知道在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 )
        )
    
        2
  •  0
  •   Nitin Midha    14 年前