我有一个问题,我解决了它,但是我写了一个很长的过程,我不能确定它包含所有可能的情况。
这个问题是:
如果我有一个主时间间隔(从A到B),以及多个或没有的次时间间隔。
(`From X to Y AND From X` to Y` AND X`` to Y`` AND ....`)
我希望能够在SQL Server过程和C#方法中,以最少的条件高效地将主时间区间(AB)内的所有部分(不包括次要时间区间)以分钟为单位相加,求出总和。
例如:如果我的主时间区间是从02:00到10:30
,并且有一个次要时间区间从04:00到08:00
现在我想要得到这个结果:((04:00 - 02:00) + (10:30 -08:00))* 60
图示例:
在第一个例子中,结果将是:
((X-A) + (B-Y)) * 60
当我有许多次要期间时,情况会更加复杂。
注意:
当我需要将主期间[A,B]与最多两个平行的次要期间集合的并集进行比较时,可能会发生次要期间之间的重叠。第一个集合只包含一个次要期间,而第二个集合包含(多个或零个)次要期间。例如,在比较[A,B]
与(2,5
)集合的图表中,第一个集合(2)
包含一个次要期间,而第二个集合(5)
包含三个次要期间。这是最糟糕的情况,我需要处理。
例如:
如果我的主区间是[15:00,19:40]
,
并且我有两组次要区间。根据我的规则,其中至少一组应该包含一个次要区间。
比方说,第一组是[11:00,16:00]
,
而第二组由两个次要区间[10:00,15:00],[16:30,17:45]
组成。
现在我想得到结果(16:30 -16:00) +(19:40 -17:45)
根据评论:
我的表格如下:
第一个表格包含了次要期间,同一日期特定员工最多有两组次要期间。第一组只包含工作日(W)
的一个次要期间[work_st, work_end]
,如果这一天是周末(E)
,则此集合将为空,在这种情况下,次要期间之间不会重叠。而第二组可以包含同一日期内的多个次要期间[check_in,check_out]
,因为员工可能在同一天内多次签到/签退。
emp_num day_date work_st work_end check_in check_out day_state
547 2015-4-1 08:00 16:00 07:45 12:10 W
547 2015-4-1 08:00 16:00 12:45 17:24 W
547 2015-4-2 00:00 00:00 07:11 13:11 E
第二个表格包含主时间段[A,B]
,这是该员工在当天的一个时间段(一条记录)。emp_num day_date mission_in mission_out
547 2015-4-1 15:00 21:30
547 2015-4-2 8:00 14:00
在前面的示例中,如果我有一个必需的过程或方法,此过程应该接受两个参数:
- 日期
- 员工编号
在前面的示例中,应该像这样('2015-4-1' ,547)
根据我的解释:
第二张表中主要期间(任务期间)
[A,B]
: 对于该日期的员工,此日期应仅有一个期间。[15:00,21:30]
对于已传递日期
('2015-4-1')
的该员工的次要时段: 来自第一张表的两组子时间段(最坏情况)第一组应包含一个(或零个)子时间段
[08:00,16:00]
, 第二组可以包含多个子时间段(或零个)[07:45,12:10]
,[12:45,17:24]
输出结果应为[17:24,21:30]并转换为分钟
注意
所有day_date、mission_in、mission_out、work_st、work_end、check_in、check_out
都是datetime
字段,
但为简化起见,我仅在示例中放置了时间,并且希望忽略除day_date
外的日期部分,因为它是我基于emp_num
计算的日期。
2
,因此结果将是(B-Y)
,或者存在许多次要间隔或根本没有次要间隔。 - Anyname Donotcare