gpt4 book ai didi

sql - 过滤 SQL 行

转载 作者:行者123 更新时间:2023-12-05 01:34:43 25 4
gpt4 key购买 nike

表架构

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'

输出:

输出应该是所有行,这样时间过滤器应该以轮类的形式应用于每一天。因此,如果我们使用这些参数,那么输出应该是从 ID 1 到 5 的前 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))

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

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

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

我们将不胜感激任何帮助。

最佳答案

我认为你不能单独考虑日期和时间。如果您想知道在 02/02/2010 的 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 )
)

关于sql - 过滤 SQL 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2186480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com