ฉันต้องการแปลงข้อมูลระหว่างสองระบบ
ระบบแรกจัดเก็บตารางเวลาเป็นรายการธรรมดาของวันที่ แต่ละวันที่รวมอยู่ในกำหนดการคือหนึ่งแถว อาจมีช่องว่างต่าง ๆ ในลำดับของวันที่ (วันหยุดสุดสัปดาห์วันหยุดราชการและหยุดอีกต่อไปบางวันของสัปดาห์อาจไม่รวมอยู่ในตาราง) ไม่มีช่องว่างเลยแม้แต่วันหยุดสุดสัปดาห์ก็สามารถรวม กำหนดการอาจนานถึง 2 ปี โดยปกติจะใช้เวลาไม่กี่สัปดาห์
นี่คือตัวอย่างง่ายๆของตารางที่ครอบคลุมสองสัปดาห์ยกเว้นวันหยุดสุดสัปดาห์ (มีตัวอย่างที่ซับซ้อนมากขึ้นในสคริปต์ด้านล่าง):
+----+------------+------------+---------+--------+
| 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)
)
ระบบที่สองจัดเก็บตารางเวลาเป็นช่วงเวลาด้วยรายการวันในสัปดาห์ที่เป็นส่วนหนึ่งของกำหนดการ แต่ละช่วงเวลาจะถูกกำหนดโดยวันที่เริ่มต้นและวันที่สิ้นสุด (รวม) และรายการของวันในสัปดาห์ที่รวมอยู่ในกำหนดการ ในรูปแบบนี้คุณสามารถกำหนดรูปแบบรายสัปดาห์ซ้ำ ๆ ได้อย่างมีประสิทธิภาพเช่น Mon-Wed แต่มันจะกลายเป็นความเจ็บปวดเมื่อรูปแบบหยุดชะงักเช่นโดยวันหยุดนักขัตฤกษ์
นี่คือลักษณะตัวอย่างง่ายๆด้านบน:
+------------+------------+------------+----------+----------------------+
| ContractID | StartDT | EndDT | DayCount | WeekDays |
+------------+------------+------------+----------+----------------------+
| 1 | 2016-05-02 | 2016-05-13 | 10 | Mon,Tue,Wed,Thu,Fri, |
+------------+------------+------------+----------+----------------------+
[StartDT;EndDT]
ช่วงเวลาที่เป็นของสัญญาเดียวกันไม่ควรทับซ้อนกัน
ฉันต้องการแปลงข้อมูลจากระบบแรกเป็นรูปแบบที่ใช้โดยระบบที่สอง ในขณะนี้ฉันกำลังแก้ไขปัญหานี้ในฝั่งไคลเอ็นต์ใน C # สำหรับสัญญาที่ให้ไว้ แต่ฉันต้องการทำใน T-SQL ทางฝั่งเซิร์ฟเวอร์สำหรับการประมวลผลจำนวนมากและส่งออก / นำเข้าระหว่างเซิร์ฟเวอร์ มีโอกาสมากที่สุดที่จะสามารถทำได้โดยใช้ CLR UDF แต่ในขั้นตอนนี้ฉันไม่สามารถใช้ 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
สำหรับแต่ละเกาะพบเช่นผมสร้างรายการคั่นด้วยเครื่องหมายจุลภาคที่แตกต่างกัน WeekDays
ในกลุ่มที่สองผมผ่านพบเกาะต่อไปโดยมองไปที่ช่องว่างในลำดับของตัวเลขสัปดาห์หรือการเปลี่ยนแปลงใน
ด้วยวิธีนี้แต่ละสัปดาห์บางส่วนจะสิ้นสุดลงในช่วงเวลาพิเศษดังที่แสดงไว้ด้านบนเนื่องจากแม้ว่าตัวเลขของสัปดาห์จะต่อเนื่องกัน แต่การWeekDays
เปลี่ยนแปลง นอกจากนี้อาจมีช่องว่างปกติภายในหนึ่งสัปดาห์ (ดูContractID=3
ในตัวอย่างข้อมูลซึ่งมีข้อมูลเพียงอย่างเดียวMon,Wed,Fri,
) และวิธีการนี้จะสร้างช่วงเวลาแยกต่างหากสำหรับแต่ละวันในตารางดังกล่าว ในด้านสว่างมันสร้างหนึ่งช่วงเวลาถ้ากำหนดการไม่มีช่องว่างใด ๆ เลย (ดูContractID=7
ในตัวอย่างข้อมูลที่มีวันหยุดสุดสัปดาห์) และในกรณีนั้นมันไม่สำคัญว่าสัปดาห์เริ่มต้นหรือสิ้นสุดจะเป็นบางส่วน
โปรดดูตัวอย่างอื่น ๆ ในสคริปต์ด้านล่างเพื่อทำความเข้าใจเกี่ยวกับสิ่งที่ฉันทำ คุณจะเห็นว่าไม่รวมวันหยุดสุดสัปดาห์บ่อยนัก แต่วันอื่น ๆ ในสัปดาห์ก็ไม่สามารถยกเว้นได้ ในตัวอย่างที่ 3 เท่านั้นMon
, Wed
และFri
เป็นส่วนหนึ่งของตาราง นอกจากนี้ยังสามารถรวมวันหยุดสุดสัปดาห์ได้ในตัวอย่างที่ 7 การแก้ปัญหาควรปฏิบัติต่อทุกวันในสัปดาห์อย่างเท่าเทียมกัน สามารถรวมหรือแยกวันใดก็ได้ในสัปดาห์ออกจากกำหนดการ
ในการตรวจสอบว่ารายการช่วงเวลาที่สร้างขึ้นอธิบายกำหนดการที่กำหนดอย่างถูกต้องคุณสามารถใช้รหัสหลอกต่อไปนี้:
- วนซ้ำทุกช่วงเวลา
- สำหรับแต่ละช่วงเวลาวนซ้ำผ่านวันที่ในปฏิทินทั้งหมดระหว่างวันที่เริ่มต้นและวันที่สิ้นสุด (รวมอยู่ด้วย)
- สำหรับการตรวจสอบแต่ละวันถ้าวันของสัปดาห์ที่เป็น บริษัท
WeekDays
จดทะเบียนใน ถ้าใช่แล้ววันนี้จะรวมอยู่ในกำหนดการ
หวังว่านี่จะอธิบายในกรณีที่ควรสร้างช่วงเวลาใหม่ ในตัวอย่าง 4 และ 5 หนึ่งวันจันทร์ ( 2016-05-09
) จะถูกลบออกจากกลางตารางและไม่สามารถแสดงช่วงเวลาดังกล่าวได้ในช่วงเวลาเดียว ในตัวอย่างที่ 6 มีช่องว่างยาวในกำหนดการดังนั้นจึงจำเป็นต้องใช้ช่วงเวลาสองช่วง
ช่วงเวลาแสดงรูปแบบรายสัปดาห์ในกำหนดเวลาและเมื่อรูปแบบถูกรบกวน / เปลี่ยนช่วงเวลาใหม่จะต้องมีการเพิ่ม ในตัวอย่าง 11 สามสัปดาห์แรกมีรูปแบบนั้นแบบนี้เปลี่ยนแปลงไปTue
Thu
ดังนั้นเราต้องใช้สองช่วงเวลาเพื่ออธิบายกำหนดการดังกล่าว
ฉันใช้ SQL Server 2008 อยู่ในขณะนี้ดังนั้นโซลูชันควรทำงานในเวอร์ชันนี้ หากวิธีการแก้ปัญหาสำหรับ SQL 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
มี403,555
แถวที่มีแตกต่างกัน15,857
ContractIDs
คำตอบทั้งหมดให้ผลลัพธ์ที่ถูกต้อง (อย่างน้อยสำหรับข้อมูลของฉัน) และทั้งหมดนั้นมีความรวดเร็วพอสมควร แต่คำตอบนั้นต่างกันในแง่ดีที่สุด ช่วงเวลาที่น้อยลงที่สร้างขึ้นที่ดีกว่า ฉันรวมรันไทม์เพื่อความอยากรู้ โฟกัสหลักคือผลลัพธ์ที่ถูกต้องและเหมาะสมที่สุดไม่ใช่ความเร็ว (เว้นแต่จะใช้เวลานานเกินไป - ฉันหยุดการสอบถามซ้ำโดย Ziggy Crueltyfree Zeitgeister หลังจาก 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 | | |
+--------------------------------------------------------+-----------+---------+
@Dst
) สองสัปดาห์แรกของตารางมีเพียงTue
คุณจึงไม่สามารถมีได้WeekDays=Tue,Thu,
ในสัปดาห์นี้ สองสัปดาห์สุดท้ายของตารางมีเพียงThu
คุณจึงไม่สามารถมีได้อีกWeekDays=Tue,Thu,
ในสัปดาห์นี้ วิธีแก้ปัญหาย่อยที่เหมาะสมสำหรับมันจะเป็นสามแถว: เพียงแค่Tue
สองสัปดาห์แรกจากนั้นTue,Thu,
สำหรับสัปดาห์ที่สามที่มีทั้งสองTue
และThu
จากนั้นThu
ในช่วงสองสัปดาห์ที่ผ่านมา
ContractID
การเปลี่ยนแปลงถ้าช่วงเวลา ไปเกิน 7 วันและไม่เห็นวันสัปดาห์ใหม่มาก่อนหากมีช่องว่างในรายการวันที่กำหนด
(11,'2016-05-03', '2016-05-17', 3, 'Tue,'), (11,'2016-05-19', '2016-06-02', 3, 'Thu,');
อยู่ใน @Dst ด้วยTue, Thu,
หรือไม่