我需要在两个系统之间转换数据。
第一个系统将日程存储为一个简单的日期列表。附表中包含的每个日期都是一行。在日期顺序上可能存在各种差距(周末、公共假日和较长的暂停时间,一周中的某些日子可能被排除在时间表之外)。根本不可能有空隙,甚至连周末都可以包括在内。这个时间表可以长达两年。通常只有几个星期长。
下面是一个不包括周末的两周时间表的简单示例(下面的脚本中有更复杂的例子):
+----+------------+------------+---------+--------+
| ID | ContractID | dt | dowChar | dowInt |
+----+------------+------------+---------+--------+
| 10 | 1 | 2016-05-02 | Mon | 2 |
| 11 | 1 | 2016-05-03 | Tue | 3 |
| 12 | 1 | 2016-05-04 | Wed | 4 |
| 13 | 1 | 2016-05-05 | Thu | 5 |
| 14 | 1 | 2016-05-06 | Fri | 6 |
| 15 | 1 | 2016-05-09 | Mon | 2 |
| 16 | 1 | 2016-05-10 | Tue | 3 |
| 17 | 1 | 2016-05-11 | Wed | 4 |
| 18 | 1 | 2016-05-12 | Thu | 5 |
| 19 | 1 | 2016-05-13 | Fri | 6 |
+----+------------+------------+---------+--------+ID是唯一的,但它不一定是顺序的(它是主键)。日期在每个合同中是唯一的(在(ContractID, dt)上有唯一的索引)。
第二,系统将计划与作为计划一部分的周天数列表作为间隔存储。每个间隔由其开始日期和结束日期(包括)以及计划中包括的周天数列表来定义。在这种格式中,您可以有效地定义重复的每周模式,比如蒙-韦德,但是当模式被扰乱时(例如公共假日),它就会变得很痛苦。
下面是上面这个简单的例子的样子:
+------------+------------+------------+----------+----------------------+
| ContractID | StartDT | EndDT | DayCount | WeekDays |
+------------+------------+------------+----------+----------------------+
| 1 | 2016-05-02 | 2016-05-13 | 10 | Mon,Tue,Wed,Thu,Fri, |
+------------+------------+------------+----------+----------------------+属于同一契约的[StartDT;EndDT]间隔不应重叠。
我需要将数据从第一个系统转换为第二个系统使用的格式。目前,我正在C#中的客户端为单个给定的合同解决这个问题,但我想在服务器端用this进行批量处理和服务器之间的导出/导入。很可能,它可以使用CLR完成,但在现阶段我不能使用SQLCLR。
例如,这个时间表:
+-----+------------+------------+---------+--------+
| ID | ContractID | dt | dowChar | dowInt |
+-----+------------+------------+---------+--------+
| 223 | 2 | 2016-05-05 | Thu | 5 |
| 224 | 2 | 2016-05-06 | Fri | 6 |
| 225 | 2 | 2016-05-09 | Mon | 2 |
| 226 | 2 | 2016-05-10 | Tue | 3 |
| 227 | 2 | 2016-05-11 | Wed | 4 |
| 228 | 2 | 2016-05-12 | Thu | 5 |
| 229 | 2 | 2016-05-13 | Fri | 6 |
| 230 | 2 | 2016-05-16 | Mon | 2 |
| 231 | 2 | 2016-05-17 | Tue | 3 |
+-----+------------+------------+---------+--------+应该变成这样:
+------------+------------+------------+----------+----------------------+
| ContractID | StartDT | EndDT | DayCount | WeekDays |
+------------+------------+------------+----------+----------------------+
| 2 | 2016-05-05 | 2016-05-17 | 9 | Mon,Tue,Wed,Thu,Fri, |
+------------+------------+------------+----------+----------------------+,而不是这个:
+------------+------------+------------+----------+----------------------+
| ContractID | StartDT | EndDT | DayCount | WeekDays |
+------------+------------+------------+----------+----------------------+
| 2 | 2016-05-05 | 2016-05-06 | 2 | Thu,Fri, |
| 2 | 2016-05-09 | 2016-05-13 | 5 | Mon,Tue,Wed,Thu,Fri, |
| 2 | 2016-05-16 | 2016-05-17 | 2 | Mon,Tue, |
+------------+------------+------------+----------+----------------------+我试图应用gaps-and-islands方法来解决这个问题。我两次就试过了。在第一遍我发现岛屿的简单连续的日子,即岛的结束是任何间隔的日子序列,无论是周末,公共假日或其他什么。对于发现的每一个岛屿,我都会构建一个以逗号分隔的独立WeekDays列表。在第二次测试中,I组通过观察周数的间隔或WeekDays的变化,进一步发现了岛屿。
使用这种方法,每个部分周最终都是一个额外的间隔,如上面所示,因为即使周数是连续的,WeekDays也会发生变化。此外,还可以在一周内出现定期的间隙(参见示例数据中的ContractID=3,它只包含Mon,Wed,Fri,的数据),这种方法将为此类日程中的每一天生成不同的间隔。好的一面是,如果计划根本没有任何空白(请参阅包含周末的示例数据中的ContractID=7 ),则会产生一个间隔,而在这种情况下,周的开始或结束是局部的并不重要。
请参阅下面脚本中的其他示例,以便更好地了解我的目标。你可以看到,周末经常被排除在外,但一周中的任何其他日子也可能被排除在外。在示例3中,只有Mon、Wed和Fri是计划的一部分。此外,周末也可以包括在内,如例7。解决方案应该平等对待一周中的所有日子。一周中的任何一天都可以包括在内,也可以排除在日程之外。
要验证生成的间隔列表是否正确地描述了给定的计划,可以使用以下伪代码:
WeekDays中。如果是,则将此日期包括在附表中。希望这能澄清在什么情况下应该创建一个新的间隔。在示例4和5中,一个星期一(2016-05-09)从时间表的中间移除,这样的调度不能用单个间隔来表示。在示例6中,日程安排有很长的差距,因此需要两次间隔。
间隔表示计划中的每周模式,当模式被中断/更改时,必须添加新的间隔。例如,前三周有一个模式Tue,然后该模式更改为Thu。因此,我们需要两个间隔来描述这样的时间表。
目前我正在使用Server 2008,因此解决方案应该在此版本中工作。如果Server 2008的解决方案可以使用后期版本的特性进行简化/改进,这是一个额外的好处,也请展示出来。
我有一个Calendar表(日期列表)和Numbers表(从1开始的整数列表),所以如果需要的话,可以使用它们。还可以创建临时表,并有几个查询在几个阶段处理数据。但是,算法中的阶段数必须是固定的,游标和显式WHILE循环是不确定的。
示例数据和预期结果的
-- @Src is sample data
-- @Dst is expected result
DECLARE @Src TABLE (ID int PRIMARY KEY, ContractID int, dt date, dowChar char(3), dowInt int);
INSERT INTO @Src (ID, ContractID, dt, dowChar, dowInt) VALUES
-- simple two weeks (without weekend)
(110, 1, '2016-05-02', 'Mon', 2),
(111, 1, '2016-05-03', 'Tue', 3),
(112, 1, '2016-05-04', 'Wed', 4),
(113, 1, '2016-05-05', 'Thu', 5),
(114, 1, '2016-05-06', 'Fri', 6),
(115, 1, '2016-05-09', 'Mon', 2),
(116, 1, '2016-05-10', 'Tue', 3),
(117, 1, '2016-05-11', 'Wed', 4),
(118, 1, '2016-05-12', 'Thu', 5),
(119, 1, '2016-05-13', 'Fri', 6),
-- a partial end of the week, the whole week, partial start of the week (without weekends)
(223, 2, '2016-05-05', 'Thu', 5),
(224, 2, '2016-05-06', 'Fri', 6),
(225, 2, '2016-05-09', 'Mon', 2),
(226, 2, '2016-05-10', 'Tue', 3),
(227, 2, '2016-05-11', 'Wed', 4),
(228, 2, '2016-05-12', 'Thu', 5),
(229, 2, '2016-05-13', 'Fri', 6),
(230, 2, '2016-05-16', 'Mon', 2),
(231, 2, '2016-05-17', 'Tue', 3),
-- only Mon, Wed, Fri are included across two weeks plus partial third week
(310, 3, '2016-05-02', 'Mon', 2),
(311, 3, '2016-05-04', 'Wed', 4),
(314, 3, '2016-05-06', 'Fri', 6),
(315, 3, '2016-05-09', 'Mon', 2),
(317, 3, '2016-05-11', 'Wed', 4),
(319, 3, '2016-05-13', 'Fri', 6),
(330, 3, '2016-05-16', 'Mon', 2),
-- a whole week (without weekend), in the second week Mon is not included
(410, 4, '2016-05-02', 'Mon', 2),
(411, 4, '2016-05-03', 'Tue', 3),
(412, 4, '2016-05-04', 'Wed', 4),
(413, 4, '2016-05-05', 'Thu', 5),
(414, 4, '2016-05-06', 'Fri', 6),
(416, 4, '2016-05-10', 'Tue', 3),
(417, 4, '2016-05-11', 'Wed', 4),
(418, 4, '2016-05-12', 'Thu', 5),
(419, 4, '2016-05-13', 'Fri', 6),
-- three weeks, but without Mon in the second week (no weekends)
(510, 5, '2016-05-02', 'Mon', 2),
(511, 5, '2016-05-03', 'Tue', 3),
(512, 5, '2016-05-04', 'Wed', 4),
(513, 5, '2016-05-05', 'Thu', 5),
(514, 5, '2016-05-06', 'Fri', 6),
(516, 5, '2016-05-10', 'Tue', 3),
(517, 5, '2016-05-11', 'Wed', 4),
(518, 5, '2016-05-12', 'Thu', 5),
(519, 5, '2016-05-13', 'Fri', 6),
(520, 5, '2016-05-16', 'Mon', 2),
(521, 5, '2016-05-17', 'Tue', 3),
(522, 5, '2016-05-18', 'Wed', 4),
(523, 5, '2016-05-19', 'Thu', 5),
(524, 5, '2016-05-20', 'Fri', 6),
-- long gap between two intervals
(623, 6, '2016-05-05', 'Thu', 5),
(624, 6, '2016-05-06', 'Fri', 6),
(625, 6, '2016-05-09', 'Mon', 2),
(626, 6, '2016-05-10', 'Tue', 3),
(627, 6, '2016-05-11', 'Wed', 4),
(628, 6, '2016-05-12', 'Thu', 5),
(629, 6, '2016-05-13', 'Fri', 6),
(630, 6, '2016-05-16', 'Mon', 2),
(631, 6, '2016-05-17', 'Tue', 3),
(645, 6, '2016-06-06', 'Mon', 2),
(646, 6, '2016-06-07', 'Tue', 3),
(647, 6, '2016-06-08', 'Wed', 4),
(648, 6, '2016-06-09', 'Thu', 5),
(649, 6, '2016-06-10', 'Fri', 6),
(655, 6, '2016-06-13', 'Mon', 2),
(656, 6, '2016-06-14', 'Tue', 3),
(657, 6, '2016-06-15', 'Wed', 4),
(658, 6, '2016-06-16', 'Thu', 5),
(659, 6, '2016-06-17', 'Fri', 6),
-- two weeks, no gaps between days at all, even weekends are included
(710, 7, '2016-05-02', 'Mon', 2),
(711, 7, '2016-05-03', 'Tue', 3),
(712, 7, '2016-05-04', 'Wed', 4),
(713, 7, '2016-05-05', 'Thu', 5),
(714, 7, '2016-05-06', 'Fri', 6),
(715, 7, '2016-05-07', 'Sat', 7),
(716, 7, '2016-05-08', 'Sun', 1),
(725, 7, '2016-05-09', 'Mon', 2),
(726, 7, '2016-05-10', 'Tue', 3),
(727, 7, '2016-05-11', 'Wed', 4),
(728, 7, '2016-05-12', 'Thu', 5),
(729, 7, '2016-05-13', 'Fri', 6),
-- no gaps between days at all, even weekends are included, with partial weeks
(805, 8, '2016-04-30', 'Sat', 7),
(806, 8, '2016-05-01', 'Sun', 1),
(810, 8, '2016-05-02', 'Mon', 2),
(811, 8, '2016-05-03', 'Tue', 3),
(812, 8, '2016-05-04', 'Wed', 4),
(813, 8, '2016-05-05', 'Thu', 5),
(814, 8, '2016-05-06', 'Fri', 6),
(815, 8, '2016-05-07', 'Sat', 7),
(816, 8, '2016-05-08', 'Sun', 1),
(825, 8, '2016-05-09', 'Mon', 2),
(826, 8, '2016-05-10', 'Tue', 3),
(827, 8, '2016-05-11', 'Wed', 4),
(828, 8, '2016-05-12', 'Thu', 5),
(829, 8, '2016-05-13', 'Fri', 6),
(830, 8, '2016-05-14', 'Sat', 7),
-- only Mon-Wed included, two weeks plus partial third week
(910, 9, '2016-05-02', 'Mon', 2),
(911, 9, '2016-05-03', 'Tue', 3),
(912, 9, '2016-05-04', 'Wed', 4),
(915, 9, '2016-05-09', 'Mon', 2),
(916, 9, '2016-05-10', 'Tue', 3),
(917, 9, '2016-05-11', 'Wed', 4),
(930, 9, '2016-05-16', 'Mon', 2),
(931, 9, '2016-05-17', 'Tue', 3),
-- only Thu-Sun included, three weeks
(1013,10,'2016-05-05', 'Thu', 5),
(1014,10,'2016-05-06', 'Fri', 6),
(1015,10,'2016-05-07', 'Sat', 7),
(1016,10,'2016-05-08', 'Sun', 1),
(1018,10,'2016-05-12', 'Thu', 5),
(1019,10,'2016-05-13', 'Fri', 6),
(1020,10,'2016-05-14', 'Sat', 7),
(1021,10,'2016-05-15', 'Sun', 1),
(1023,10,'2016-05-19', 'Thu', 5),
(1024,10,'2016-05-20', 'Fri', 6),
(1025,10,'2016-05-21', 'Sat', 7),
(1026,10,'2016-05-22', 'Sun', 1),
-- only Tue for first three weeks, then only Thu for the next three weeks
(1111,11,'2016-05-03', 'Tue', 3),
(1116,11,'2016-05-10', 'Tue', 3),
(1131,11,'2016-05-17', 'Tue', 3),
(1123,11,'2016-05-19', 'Thu', 5),
(1124,11,'2016-05-26', 'Thu', 5),
(1125,11,'2016-06-02', 'Thu', 5),
-- one week, then one week gap, then one week
(1210,12,'2016-05-02', 'Mon', 2),
(1211,12,'2016-05-03', 'Tue', 3),
(1212,12,'2016-05-04', 'Wed', 4),
(1213,12,'2016-05-05', 'Thu', 5),
(1214,12,'2016-05-06', 'Fri', 6),
(1215,12,'2016-05-16', 'Mon', 2),
(1216,12,'2016-05-17', 'Tue', 3),
(1217,12,'2016-05-18', 'Wed', 4),
(1218,12,'2016-05-19', 'Thu', 5),
(1219,12,'2016-05-20', 'Fri', 6);
SELECT ID, ContractID, dt, dowChar, dowInt
FROM @Src
ORDER BY ContractID, dt;
DECLARE @Dst TABLE (ContractID int, StartDT date, EndDT date, DayCount int, WeekDays varchar(255));
INSERT INTO @Dst (ContractID, StartDT, EndDT, DayCount, WeekDays) VALUES
(1, '2016-05-02', '2016-05-13', 10, 'Mon,Tue,Wed,Thu,Fri,'),
(2, '2016-05-05', '2016-05-17', 9, 'Mon,Tue,Wed,Thu,Fri,'),
(3, '2016-05-02', '2016-05-16', 7, 'Mon,Wed,Fri,'),
(4, '2016-05-02', '2016-05-06', 5, 'Mon,Tue,Wed,Thu,Fri,'),
(4, '2016-05-10', '2016-05-13', 4, 'Tue,Wed,Thu,Fri,'),
(5, '2016-05-02', '2016-05-06', 5, 'Mon,Tue,Wed,Thu,Fri,'),
(5, '2016-05-10', '2016-05-20', 9, 'Mon,Tue,Wed,Thu,Fri,'),
(6, '2016-05-05', '2016-05-17', 9, 'Mon,Tue,Wed,Thu,Fri,'),
(6, '2016-06-06', '2016-06-17', 10, 'Mon,Tue,Wed,Thu,Fri,'),
(7, '2016-05-02', '2016-05-13', 12, 'Sun,Mon,Tue,Wed,Thu,Fri,Sat,'),
(8, '2016-04-30', '2016-05-14', 15, 'Sun,Mon,Tue,Wed,Thu,Fri,Sat,'),
(9, '2016-05-02', '2016-05-17', 8, 'Mon,Tue,Wed,'),
(10,'2016-05-05', '2016-05-22', 12, 'Sun,Thu,Fri,Sat,'),
(11,'2016-05-03', '2016-05-17', 3, 'Tue,'),
(11,'2016-05-19', '2016-06-02', 3, 'Thu,'),
(12,'2016-05-02', '2016-05-06', 5, 'Mon,Tue,Wed,Thu,Fri,'),
(12,'2016-05-16', '2016-05-20', 5, 'Mon,Tue,Wed,Thu,Fri,');
SELECT ContractID, StartDT, EndDT, DayCount, WeekDays
FROM @Dst
ORDER BY ContractID, StartDT;答案的
真正的表@Src有带有15,857区分ContractIDs的403,555行。所有的答案都会产生正确的结果(至少对我的数据而言),而且它们都相当快,但它们的最优性不同。生成的间隔越少,越好。我只是出于好奇考虑了运行时间。主要关注的是正确和最优的结果,而不是速度(除非需要太长时间--我在10分钟后停止了的非递归查询)。
+--------------------------------------------------------+-----------+---------+
| Answer | Intervals | Seconds |
+--------------------------------------------------------+-----------+---------+
| Ziggy Crueltyfree Zeitgeister | 25751 | 7.88 |
| While loop | | |
| | | |
| Ziggy Crueltyfree Zeitgeister | 25751 | 8.27 |
| Recursive | | |
| | | |
| Michael Green | 25751 | 22.63 |
| Recursive | | |
| | | |
| Geoff Patterson | 26670 | 4.79 |
| Weekly gaps-and-islands with merging of partial weeks | | |
| | | |
| Vladimir Baranov | 34560 | 4.03 |
| Daily, then weekly gaps-and-islands | | |
| | | |
| Mikael Eriksson | 35840 | 0.65 |
| Weekly gaps-and-islands | | |
+--------------------------------------------------------+-----------+---------+
| Vladimir Baranov | 25751 | 121.51 |
| Cursor | | |
+--------------------------------------------------------+-----------+---------+发布于 2016-04-26 07:52:58
不完全是你想要的,但可能对你感兴趣。
该查询为每周使用的天数创建带有逗号分隔字符串的周。然后,它会在Weekdays中找到连续几周使用相同模式的岛屿。
with Weeks as
(
select T.*,
row_number() over(partition by T.ContractID, T.WeekDays order by T.WeekNumber) as rn
from (
select S1.ContractID,
min(S1.dt) as StartDT,
max(S1.dt) as EndDT,
datediff(day, 0, S1.dt) / 7 as WeekNumber, -- Number of weeks since '1900-01-01 (a monday)'
count(*) as DayCount,
stuff((
select ','+S2.dowChar
from @Src as S2
where S2.ContractID = S1.ContractID and
S2.dt between min(S1.dt) and max(S1.dt)
order by S2.dt
for xml path('')
), 1, 1, '') as WeekDays
from @Src as S1
group by S1.ContractID,
datediff(day, 0, S1.dt) / 7
) as T
)
select W.ContractID,
min(W.StartDT) as StartDT,
max(W.EndDT) as EndDT,
count(*) * W.DayCount as DayCount,
W.WeekDays
from Weeks as W
group by W.ContractID,
W.WeekDays,
W.DayCount,
W.rn - W.WeekNumber
order by W.ContractID,
min(W.WeekNumber);结果:
ContractID StartDT EndDT DayCount WeekDays
----------- ---------- ---------- ----------- -----------------------------
1 2016-05-02 2016-05-13 10 Mon,Tue,Wed,Thu,Fri
2 2016-05-05 2016-05-06 2 Thu,Fri
2 2016-05-09 2016-05-13 5 Mon,Tue,Wed,Thu,Fri
2 2016-05-16 2016-05-17 2 Mon,Tue
3 2016-05-02 2016-05-13 6 Mon,Wed,Fri
3 2016-05-16 2016-05-16 1 Mon
4 2016-05-02 2016-05-06 5 Mon,Tue,Wed,Thu,Fri
4 2016-05-10 2016-05-13 4 Tue,Wed,Thu,Fri
5 2016-05-02 2016-05-06 5 Mon,Tue,Wed,Thu,Fri
5 2016-05-10 2016-05-13 4 Tue,Wed,Thu,Fri
5 2016-05-16 2016-05-20 5 Mon,Tue,Wed,Thu,Fri
6 2016-05-05 2016-05-06 2 Thu,Fri
6 2016-05-09 2016-05-13 5 Mon,Tue,Wed,Thu,Fri
6 2016-05-16 2016-05-17 2 Mon,Tue
6 2016-06-06 2016-06-17 10 Mon,Tue,Wed,Thu,Fri
7 2016-05-02 2016-05-08 7 Mon,Tue,Wed,Thu,Fri,Sat,Sun
7 2016-05-09 2016-05-13 5 Mon,Tue,Wed,Thu,Fri
8 2016-04-30 2016-05-01 2 Sat,Sun
8 2016-05-02 2016-05-08 7 Mon,Tue,Wed,Thu,Fri,Sat,Sun
8 2016-05-09 2016-05-14 6 Mon,Tue,Wed,Thu,Fri,Sat
9 2016-05-02 2016-05-11 6 Mon,Tue,Wed
9 2016-05-16 2016-05-17 2 Mon,Tue
10 2016-05-05 2016-05-22 12 Thu,Fri,Sat,Sun
11 2016-05-03 2016-05-10 2 Tue
11 2016-05-17 2016-05-19 2 Tue,Thu
11 2016-05-26 2016-06-02 2 ThuContractID = 2显示了结果与您想要的结果之间的差异。第一周和最后一周将被视为不同的时期,因为WeekDays是不同的。
发布于 2016-04-27 18:52:35
最后,我得到了一种方法,在这种情况下得到了最优的解决方案,我认为总体上会做得很好。然而,这个解决方案相当冗长,所以看看其他人是否有一种更简洁的方法是很有趣的。
下面是算法的概要:
ContractId内每周的岛数ContractId且具有相同WeekDays的相邻周WeekDays匹配前一个分组的WeekDays的一个前导子集,则合并到前一个分组中。WeekDays匹配下一个分组的WeekDays的尾随子集,则合并到下一个分组中。发布于 2016-04-24 03:27:37
我无法理解将周和周末组合在一起的逻辑(例如,一个周末有两个星期,哪个星期是周末?)
下面的查询生成所需的输出,但它只对连续工作日进行分组,并分组周Sat(而不是Mon)。虽然不完全是你想要的,也许这可以为不同的策略提供一些线索。天的分组来自这里。使用的窗口函数应该与SQLServer 2008一起工作,但是我没有这个版本来测试它是否真的工作。
WITH
mysrc AS (
SELECT *, RANK() OVER (PARTITION BY ContractID ORDER BY DT) AS rank
FROM @Src
),
prepos AS (
SELECT s.*, pos.ID AS posid
FROM mysrc s
LEFT JOIN mysrc pos ON (pos.ContractID = s.ContractID AND pos.rank = s.rank+1 AND (pos.DowInt = s.DowInt+1 OR pos.DowInt = 2 AND s.DowInt=6))
),
grped AS (
SELECT TOP 100 *, (SELECT COUNT(CASE WHEN posid IS NULL THEN 1 END) FROM prepos WHERE contractid = p.contractid AND rank < p.rank) as grp
FROM prepos p
ORDER BY ContractID, DT
)
SELECT ContractID, min(dt) AS StartDT, max(dt) AS EndDT, count(*) AS DayCount,
STUFF( (SELECT ', ' + dowchar
FROM (
SELECT TOP 100 dowint, dowchar
FROM grped
WHERE ContractID = g.ContractID AND grp = g.grp
GROUP BY dowint, dowchar
ORDER BY 1
) a
FOR XML PATH(''), TYPE).value('.','varchar(max)'), 1, 2, '') AS WeekDays
FROM grped g
GROUP BY ContractID, grp
ORDER BY 1, 2+------------+------------+------------+----------+-----------------------------------+
| ContractID | StartDT | EndDT | DayCount | WeekDays |
+------------+------------+------------+----------+-----------------------------------+
| 1 | 2/05/2016 | 13/05/2016 | 10 | Mon, Tue, Wed, Thu, Fri |
| 2 | 5/05/2016 | 17/05/2016 | 9 | Mon, Tue, Wed, Thu, Fri |
| 3 | 2/05/2016 | 2/05/2016 | 1 | Mon |
| 3 | 4/05/2016 | 4/05/2016 | 1 | Wed |
| 3 | 6/05/2016 | 9/05/2016 | 2 | Mon, Fri |
| 3 | 11/05/2016 | 11/05/2016 | 1 | Wed |
| 3 | 13/05/2016 | 16/05/2016 | 2 | Mon, Fri |
| 4 | 2/05/2016 | 6/05/2016 | 5 | Mon, Tue, Wed, Thu, Fri |
| 4 | 10/05/2016 | 13/05/2016 | 4 | Tue, Wed, Thu, Fri |
| 5 | 2/05/2016 | 6/05/2016 | 5 | Mon, Tue, Wed, Thu, Fri |
| 5 | 10/05/2016 | 20/05/2016 | 9 | Mon, Tue, Wed, Thu, Fri |
| 6 | 5/05/2016 | 17/05/2016 | 9 | Mon, Tue, Wed, Thu, Fri |
| 6 | 6/06/2016 | 17/06/2016 | 10 | Mon, Tue, Wed, Thu, Fri |
| 7 | 2/05/2016 | 7/05/2016 | 6 | Mon, Tue, Wed, Thu, Fri, Sat |
| 7 | 8/05/2016 | 13/05/2016 | 6 | Sun, Mon, Tue, Wed, Thu, Fri |
| 8 | 30/04/2016 | 30/04/2016 | 1 | Sat |
| 8 | 1/05/2016 | 7/05/2016 | 7 | Sun, Mon, Tue, Wed, Thu, Fri, Sat |
| 8 | 8/05/2016 | 14/05/2016 | 7 | Sun, Mon, Tue, Wed, Thu, Fri, Sat |
| 9 | 2/05/2016 | 4/05/2016 | 3 | Mon, Tue, Wed |
| 9 | 9/05/2016 | 10/05/2016 | 2 | Mon, Tue |
+------------+------------+------------+----------+-----------------------------------+https://dba.stackexchange.com/questions/136235
复制相似问题