2024年 节假日 sql (0.工作日 1周末休息 2节假日)


CREATE TABLE `system_workday` (
  `day_id` int(11) NOT NULL AUTO_INCREMENT,
  `day_day` int(11) DEFAULT NULL COMMENT '时间  年月日',
  `day_type` int(4) DEFAULT '0' COMMENT '类型  0.工作日 1周末休息 2节假日  ',
  PRIMARY KEY (`day_id`)
)  COMMENT='系统节假日数据';


INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240101,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240102,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240103,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240104,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240105,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240106,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240107,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240108,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240109,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240110,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240111,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240112,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240113,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240114,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240115,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240116,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240117,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240118,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240119,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240120,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240121,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240122,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240123,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240124,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240125,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240126,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240127,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240128,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240129,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240130,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240131,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240201,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240202,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240203,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240204,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240205,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240206,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240207,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240208,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240209,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240210,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240211,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240212,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240213,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240214,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240215,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240216,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240217,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240218,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240219,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240220,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240221,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240222,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240223,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240224,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240225,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240226,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240227,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240228,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240229,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240301,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240302,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240303,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240304,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240305,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240306,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240307,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240308,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240309,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240310,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240311,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240312,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240313,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240314,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240315,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240316,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240317,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240318,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240319,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240320,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240321,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240322,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240323,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240324,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240325,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240326,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240327,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240328,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240329,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240330,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240331,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240401,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240402,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240403,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240404,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240405,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240406,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240407,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240408,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240409,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240410,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240411,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240412,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240413,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240414,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240415,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240416,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240417,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240418,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240419,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240420,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240421,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240422,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240423,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240424,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240425,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240426,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240427,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240428,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240429,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240430,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240501,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240502,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240503,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240504,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240505,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240506,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240507,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240508,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240509,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240510,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240511,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240512,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240513,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240514,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240515,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240516,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240517,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240518,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240519,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240520,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240521,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240522,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240523,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240524,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240525,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240526,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240527,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240528,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240529,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240530,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240531,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240601,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240602,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240603,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240604,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240605,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240606,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240607,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240608,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240609,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240610,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240611,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240612,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240613,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240614,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240615,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240616,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240617,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240618,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240619,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240620,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240621,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240622,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240623,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240624,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240625,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240626,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240627,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240628,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240629,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240630,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240701,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240702,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240703,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240704,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240705,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240706,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240707,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240708,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240709,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240710,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240711,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240712,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240713,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240714,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240715,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240716,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240717,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240718,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240719,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240720,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240721,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240722,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240723,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240724,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240725,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240726,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240727,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240728,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240729,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240730,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240731,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240801,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240802,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240803,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240804,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240805,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240806,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240807,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240808,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240809,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240810,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240811,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240812,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240813,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240814,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240815,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240816,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240817,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240818,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240819,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240820,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240821,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240822,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240823,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240824,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240825,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240826,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240827,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240828,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240829,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240830,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240831,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240901,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240902,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240903,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240904,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240905,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240906,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240907,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240908,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240909,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240910,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240911,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240912,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240913,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240914,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240915,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240916,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240917,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240918,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240919,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240920,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240921,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240922,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240923,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240924,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240925,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240926,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240927,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240928,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240929,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20240930,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241001,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241002,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241003,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241004,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241005,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241006,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241007,2);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241008,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241009,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241010,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241011,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241012,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241013,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241014,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241015,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241016,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241017,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241018,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241019,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241020,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241021,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241022,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241023,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241024,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241025,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241026,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241027,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241028,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241029,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241030,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241031,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241101,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241102,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241103,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241104,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241105,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241106,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241107,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241108,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241109,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241110,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241111,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241112,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241113,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241114,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241115,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241116,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241117,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241118,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241119,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241120,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241121,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241122,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241123,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241124,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241125,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241126,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241127,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241128,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241129,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241130,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241201,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241202,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241203,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241204,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241205,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241206,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241207,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241208,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241209,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241210,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241211,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241212,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241213,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241214,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241215,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241216,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241217,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241218,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241219,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241220,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241221,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241222,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241223,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241224,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241225,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241226,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241227,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241228,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241229,1);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241230,0);
INSERT INTO `system_workday` (`day_day`,`day_type`) VALUES (20241231,0);
 

<think>我们有两个任务:1.计算两个日期之间的秒数差(总秒数)。2.排除周六和周日。思路:-首先,计算两个日期之间的总秒数差,可以通过DATEDIFF(SECOND,start_date,end_date)得到。-然后,减去周末所占的秒数。难点:如何计算两个日期之间包含的周末(周六和周日)的总秒数?步骤:1.计算两个日期之间的完整周数(每周7天)。每个完整周有2周末(周六和周日),即2*24*60*60秒。2.计算除去完整周后剩余的天数(不足一周的部分),然后在这些剩余天数中判断周末的天数(注意:剩余天数可能包含周六和周日)。3.将完整周中的周末秒数和剩余天数中的周末秒数相加,得到总的周末秒数。4.总秒数差减去总的周末秒数,即为排除周末后的秒数差。具体实现:我们可以通过以下步骤计算:-计算两个日期之间的天数差(DATEDIFF(DAY,start_date,end_date))。-计算完整周数:week_count=天数差/7(整数除法)。-每个完整周有2周末,所以完整周对应的周末天数:weekend_days_from_weeks=week_count*2。-剩余天数:remaining_days=天数差%7。-然后我们需要计算剩余天数中周末的天数。这里需要知道起始日期是星期几,然后根据剩余天数遍历这些天,判断是否为周末(周六或周日)。注意:SQLServer中,我们可以使用DATEPART(dw,date)函数来获取星期几(返回值取决于@@DATEFIRST设置,为了确保正确,我们可以设置SETDATEFIRST1(将星期一作为一周的第一天)或者使用其他方法避免依赖设置。但是为了简单,我们可以这样判断:如果星期天的值是1,星期六的值是7(在设置SETDATEFIRST7的情况下?)。为了避免依赖,我们可以用以下方法:-使用@@DATEFIRST设置,或者使用一个已知的日期来调整,但这样比较复杂。-另一种方法是使用DATENAME(dw,date)返回星期几的英文名称,然后判断是否为'Saturday'或'Sunday'。但这样效率较低。这里我们采用设置SETDATEFIRST1(星期一为第一天,星期天为第七天)的方式,这样:-星期六=6-星期天=7然后我们判断某一天是否为周末:IFDATEPART(dw,date)IN(6,7)但是,由于我们无法确保所有用户的数据库设置相同,因此我们需要考虑@@DATEFIRST的影响。我们可以使用以下方式避免设置的影响:-使用(DATEPART(dw,date)+@@DATEFIRST-1)%7来调整?但这样比较复杂。另一种更可靠的方法是:计算从某个固定日期(比如1900-01-01,星期一)开始的天数,然后模7,这样我们可以自己计算星期几而不依赖设置。这里为了简单,我们假设用户数据库的@@DATEFIRST设置是默认的(美国默认是7,即星期天为第一天)。但我们不能依赖这个。因此,我们可以用以下方法:-使用已知的日期:1900-01-01是星期一,那么我们可以计算从1900-01-01到给定日期的天数,然后模7,0为星期一,1为星期二,...,5为星期六,6为星期天。这样我们就可以定义:当模5或6时就是周末(星期六或星期天)。步骤:-计算给定日期与基准日期(1900-01-01)的天数差:DATEDIFF(DAY,'1900-01-01',date)-然后取模:(DATEDIFF(DAY,'1900-01-01',date)%7)得到0到6,其中0表示星期一,1星期二,...,5星期六,6星期天。-所以周末条件:(DATEDIFF(DAY,'1900-01-01',date)%7)IN(5,6)但是注意:1900-01-01是星期一吗?实际上,1900-01-01SQLServer中是星期一(根据历史日历)。但我们可以验证:1900-01-01是星期一,1900-01-07是星期天。因此,我们可以用这个方法。但是,由于我们需要遍历剩余天数(最多6天),我们可以使用一个循环或者一个数字辅助表。这里我们可以用递归CTE或者使用一个数字表。但为了避免创建辅助表,我们可以使用一个小的循环(因为剩余天数最多6天,所以循环6次是可以接受的)。具体步骤:1.计算总天数:total_days=DATEDIFF(DAY,@start_date,@end_date)2.计算完整周数:weeks=total_days/7(整数除法,用FLOOR或者直接整除,在整数除法中自动取整)3.周末天数(来自完整周):weekend_days_weeks=weeks*24.剩余天数:remaining_days=total_days%75.从开始日期的后一天开始,遍历剩余天数(remaining_days)中的每一天(注意:开始日期本身不计入剩余天数?因为总天数已经包括了开始日期和结束日期之间的天数?注意DATEDIFF(DAY)返回的是两个日期之间的边界数,比如从1号到2号,DATEDIFF(DAY)返回1,但实际天数是1天。而我们需要考虑的是从开始日期到结束日期之间的每一天(包括开始日期和结束日期之间的日期,但不包括开始日期本身?因为我们在计算周末时,需要计算的是这段时间内包含的周末天数,而这段时间的每一天都要判断,包括开始日期吗?)注意:DATEDIFF(DAY,start,end)返回的是两个日期之间跨越的天的边界数。例如:-DATEDIFF(DAY,'2024-01-01','2024-01-02')=1-而这段时间内的日期只有一天:2024-01-012024-01-02之间的日期是2024-01-01(如果按时间段来说,2024-01-0100:00:002024-01-0200:00:00之间只有2024-01-01这一天)。但是我们的需求是排除周末的秒数,所以我们需要考虑从开始日期到结束日期这个时间段内,周末所占的秒数。因此,我们需要考虑的时间段是[start_date,end_date)左闭右开?还是包括结束日期?实际上,两个日期之间的秒数差是包含整个时间段的。例如:start_date='2024-01-0100:00:00',end_date='2024-01-0200:00:00',那么秒数差是24*60*60=86400秒。而在这段时间内,只有2024-01-01这一天(全天),如果2024-01-01周末,那么整个86400秒都是周末。所以,我们需要判断时间段内包含的每一天(全天)是否是周末,如果是,则减去这一整天的秒数(86400秒)?但是注意,时间段可能不是整天,所以我们需要精确到秒。因此,更精确的方法:-首先计算总秒数:total_seconds=DATEDIFF(SECOND,@start_date,@end_date)-然后计算时间段内包含的周末秒数。计算周末秒数:-我们需要知道从开始日期到结束日期之间,哪些时间段是周末(周六和周日)。由于周末是整天,所以我们可以计算时间段内包含的周末天数,然后乘以86400?但是,如果时间段不是从一天的开始到结束,那么周末的天数就不能简单地乘以86400。例如:开始日期是星期六的下午,结束日期是星期天的上午,那么我们需要减去的时间段是星期六下午到星期天上午?不,我们只需要减去整个星期六和星期天吗?不是,我们只减去周末的时间段。所以我们需要精确地计算这段时间内周末的秒数。因此,我们需要分段计算:-首先,计算开始日期到开始日期所在天的结束时间(即当天23:59:59.999)这段时间内,如果是周末,则计算这段时间的秒数。-然后,计算结束日期所在天的开始时间(00:00:00)到结束日期这段时间内,如果是周末,则计算这段时间的秒数。-中间的时间段(整天的部分)按整天计算周末天数(乘以86400秒)。但是这样比较复杂。另一种思路:将时间段分成三部分:1.开始日期所在的不完整天(从开始时间到当天结束)2.结束日期所在的不完整天(从当天开始到结束时间)3.中间完整的天(整天)然后分别计算这三部分中周末的秒数。步骤:-计算开始日期所在天的结束时间:DATEADD(DAY,1,CAST(CAST(@start_dateASDATE)ASDATETIME))-0.001(但这样不精确,建议使用:DATEADD(DAY,1,CAST(CAST(@start_dateASDATE)ASDATETIME))然后减去一个最小时间单位,比如3毫秒,因为SQLServer的datetime精度为3.33毫秒,但我们可以使用:CONVERT(DATETIME,CONVERT(DATE,@start_date))得到当天的0点,然后加1天得到下一天的0点,然后减去3毫秒(0.003秒)?但这样不精确,而且秒数差会少。实际上,我们可以使用当天的23:59:59.997,但这样也不完美。更好的方法是使用日期类型和DATETIME2,但这里为了通用,我们假设使用datetime。实际上,我们可以这样:-开始日期所在天的结束时间:DATEADD(SECOND,86400-DATEDIFF(SECOND,CAST(@start_dateASDATE),@start_date),CAST(@start_dateASDATE))解释:先得到当天的0点(CAST(@start_dateASDATE)),然后加上(86400-当天已经过去的秒数)得到当天的结束时间(即下一天的0点减去1秒?)。但是这样计算的是当天的最后一秒。但是,由于我们只关心秒数,我们可以用数字计算。具体步骤:1.计算总秒数:total_seconds=DATEDIFF(SECOND,@start_date,@end_date)2.计算开始日期到结束日期之间包含的周末秒数(weekend_seconds):a.初始化weekend_seconds=0b.处理开始日期所在天(部分天):-如果开始日期所在天是周末,则计算从开始日期到该天结束的秒数(即从开始时间到24:00:00的秒数)。-该天结束的时间点=开始日期的下一天0点(即CAST(CAST(@start_dateASDATE)ASDATETIME)+1)-但是,如果结束日期就在同一天,那么只能取结束时间(因为结束日期可能早于下一天的0点)。-所以,实际结束点取:MIN(结束日期,开始日期的下一天0)-然后计算开始日期到这个实际结束点的秒数:DATEDIFF(SECOND,@start_date,实际结束点)-如果这一天是周末,则加上这部分秒数。c.处理结束日期所在天(部分天):-如果结束日期所在天是周末,则计算从结束日期所在天的0点到结束日期的秒数。-开始点=CAST(CAST(@end_dateASDATE)ASDATETIME)-注意:如果结束日期所在天和开始日期是同一天,那么我们已经在上一步处理了,所以这里要避免重复。-所以,我们只处理结束日期所在天不是开始日期所在天的情况。-然后,计算从该天0点到结束日期的秒数:DATEDIFF(SECOND,开始点,@end_date)-如果这一天是周末,则加上这部分秒数。d.处理中间整天:-计算中间整天:从开始日期的下一天0点到结束日期的前一天0点(或者结束日期的0点?)之间的整天。-整天的开始日期:start_date_next=CAST(CAST(@start_dateASDATE)ASDATETIME)+1(即开始日期的下一天0点)-整天的结束日期:end_date_prev=CAST(CAST(@end_dateASDATE)ASDATETIME)(即结束日期的0点)-如果start_date_next<end_date_prev,则计算中间的天数:mid_days=DATEDIFF(DAY,start_date_next,end_date_prev)-然后,对于中间的每一天,判断是否为周末,如果是,则加上86400秒。但是,这个步骤比较复杂,而且需要多次判断日期。另一种更简单的方法:使用一个日历表(calendartable),其中标记每一天是否为周末。这样我们可以直接连接日历表,然后对每个日期进行求和。但是用户没有提供日历表,所以我们不能依赖它。因此,我们采用循环的方式,从开始日期到结束日期,以天为单位,逐天判断(如果总天数很大,性能可能不好,但通常两个日期之间不会太长)。如果两个日期相差几,那么循环次数就会很多。所以我们需要更高效的方法。高效方法:我们仍然可以按照完整周和剩余天数来处理,但是要处理部分天。步骤:1.计算总秒数:total_seconds=DATEDIFF(SECOND,@start_date,@end_date)2.初始化周末秒数:weekend_seconds=03.计算完整周数:首先计算从开始日期的下一个周一开始到结束日期的前一个周日(这样可以凑成完整周),但是这样很复杂。由于时间关系,我们采用一种折中的方法:使用一个递归CTE或循环,逐天处理,但是只处理部分天(开始和结束的不完整天)和中间完整天。但是为了性能,我们可以先计算中间完整天的周末天数(通过数学计算),然后再处理开始和结束的不完整天。完整天的周末天数计算:-设开始日期的下一天0点为:next_day_start=DATEADD(DAY,1,CAST(CAST(@start_dateASDATE)ASDATETIME))-设结束日期的0点为:end_day_start=CAST(CAST(@end_dateASDATE)ASDATETIME)-如果next_day_start<end_day_start,则中间整天数为:mid_days=DATEDIFF(DAY,next_day_start,end_day_start)-然后计算这些整天中的周末天数:我们可以通过计算从next_day_start到end_day_start之间的天数(mid_days),然后计算这些天中有几个周六和周日。如何计算中间整天中的周末天数?-我们可以计算next_day_start的星期几,然后结合mid_days计算周末天数。这里我们可以用前面提到的基准日期方法(1900-01-01)来计算每一天是星期几,然后判断周末。但是,为了避免循环,我们可以用数学公式:-设first_day=next_day_start,计算first_day是星期几(0-6,0=星期一,6=星期天)。-则从first_day开始,连续mid_days天,周末的数量=2*(mid_days/7)+剩余天数中的周末数量(剩余天数=mid_days%7)。-剩余天数中的周末数量:从first_day开始,连续的剩余天数中,周末的数量可以通过一个公式计算。我们可以用一个表值函数或者casewhen。例如,我们可以创建一个0-6的数字表(虚拟表),然后判断从星期几开始,连续n天中包含几个周末。但这里我们可以用表达式:剩余天数=mid_days%7起始星期=first_day_week(0-6)然后计算从起始星期开始的连续剩余天数中,包含的周末(星期5和6,因为0-4是周一到周五,5=周六,6=周日)的数量。例如:起始星期=5(周六),剩余天数=1,则包含1周末(周六)。起始星期=5,剩余天数=2,则包含2周末(周六、周日)。起始星期=6(周日),剩余天数=1,则包含1周末(周日)。起始星期=0(周一),剩余天数=2,则包含0周末。所以,我们可以用以下方式计算:weekend_count_remain=CASEWHEN起始星期+剩余天数-1<5THEN0--全部在周五之前WHEN起始星期>5THEN剩余天数--起始星期为6(周日)或5(周六)且剩余天数>=1,但注意起始星期5时,剩余天数1122;起始星期6时,剩余天数11ELSECASEWHEN起始星期<=5AND起始星期+剩余天数-1>=6THEN剩余天数-(5-起始星期)--这里需要仔细计算...END实际上,我们可以用一个公式:计算从起始星期到结束星期(起始星期+剩余天数-1)之间,周末的数量=结束星期区间[起始星期,起始星期+剩余天数-1]中,数字5和6出现的次数。我们可以这样:weekend_count_remain=(SELECTCOUNT(*)FROM(VALUES(起始星期),(起始星期+1),...(起始星期+剩余天数-1))ASt(day_index)WHEREt.day_index%7IN(5,6)--注意:因为星期是0-6,所以模7后,5和6代表周末)但是这样在SQL中写起来困难,而且剩余天数最多可以到6,我们可以用casewhen枚举。由于剩余天数(n)最多6,我们可以写一个case表达式:weekend_count_remain=CASEWHEN剩余天数=0THEN0WHEN剩余天数=1THENCASEWHEN起始星期IN(5,6)THEN1ELSE0ENDWHEN剩余天数=2THENCASEWHEN起始星期=5THEN2WHEN起始星期=6THEN2WHEN起始星期=4THEN1--4+1=5(周六)ELSE0END...END这样写太长,但可行。或者,我们可以用数学公式:weekend_count_remain=GREATEST(0,LEAST(剩余天数,起始星期+剩余天数-5,6-起始Week+1,2))--这个公式可能不准确。鉴于剩余天数最多6,我们用一个查找表的方式,用起始星期和剩余天数来映射。这里为了简化,我们使用一个辅助的VALUES表。在SQL中,我们可以这样:SELECTCOUNT(*)AScntFROM(SELECT0ASnUNIONALLSELECT1UNIONALLSELECT2UNIONALLSELECT3UNIONALLSELECT4UNIONALLSELECT5UNIONALLSELECT6)ASnumsWHEREn<@remaining_daysAND((@start_week+n)%7)IN(5,6)然后把这个cnt作为weekend_count_remain。但是,这需要动态生成行,在函数中可能效率不高。因此,我们退而求其次,使用一个循环(由于剩余天数最多6,循环6次是可以接受的)。我们可以在函数中写一个循环,从0到remaining_days-1,然后判断每一天(start_week+i)%7是否等于5或6,是则计数。然后,完整周中的周末天数:2*(mid_days/7)[因为mid_days是整天天数,除以7取整,再乘以2]所以,中间完整天的周末天数=2*(mid_days/7)+weekend_count_remain[注意:mid_days/7是整数除法,取整]然后,再加上开始日期所在天(部分天)和结束日期所在天(部分天)的周末秒数。4.处理开始日期所在天(部分天):-判断开始日期所在天是否是周末:如果是,则计算从开始日期到min(结束日期,开始日期的下一天0)的秒数。-注意:如果开始日期所在天和结束日期所在天是同一天,那么只计算一次。-设start_date_day=CAST(CAST(@start_dateASDATE)ASDATETIME)--开始日期当天的0点-设start_date_next_day=DATEADD(DAY,1,start_date_day)--开始日期的下一天0点-实际结束点=CASEWHEN@end_date<start_date_next_dayTHEN@end_dateELSEstart_date_next_dayEND-如果开始日期所在天是周末,则加上DATEDIFF(SECOND,@start_date,实际结束点)5.处理结束日期所在天(部分天):-如果结束日期所在天和开始日期所在天不是同一天,并且结束日期所在天是周末,则计算从end_date_day(即结束日期当天的0)到@end_date的秒数。-end_date_day=CAST(CAST(@end_dateASDATE)ASDATETIME)-注意:如果结束日期所在天和开始日期所在天是同一天,那么已经在第4步计算了,所以这里要排除。6.最后,排除周末的总秒数=total_seconds-weekend_seconds由于这个逻辑非常复杂,我们将其写成一个函数。函数定义:CREATEFUNCTIONdbo.GetWorkSeconds(@start_dateDATETIME,@end_dateDATETIME)RETURNSBIGINTASBEGINDECLARE@total_secondsBIGINTSET@total_seconds=DATEDIFF(SECOND,@start_date,@end_date)--如果开始日期>=结束日期,返回0或负值?根据需求,我们返回负值或0,但通常开始日期应该小于结束日期,我们按正常处理IF@total_seconds<=0RETURN0DECLARE@weekend_secondsBIGINTSET@weekend_seconds=0--计算开始日期和结束日期的日期部分DECLARE@start_date_dateDATETIME=CAST(CAST(@start_dateASDATE)ASDATETIME)DECLARE@end_date_dateDATETIME=CAST(CAST(@end_dateASDATE)ASDATETIME)--1.处理开始日期所在天(部分天)DECLARE@start_next_dateDATETIME=DATEADD(DAY,1,@start_date_date)DECLARE@end_of_start_dateDATETIME=CASEWHEN@end_date<@start_next_dateTHEN@end_dateELSE@start_next_dateEND--判断开始日期所在天是否是周末IFdbo.IsWeekend(@start_date)=1--需要实现IsWeekend函数,或者内联判断BEGINSET@weekend_seconds=@weekend_seconds+DATEDIFF(SECOND,@start_date,@end_of_start_date)END--2.处理结束日期所在天(部分天),只有当结束日期所在天与开始日期所在天不是同一天时才处理IF@end_date_date<>@start_date_dateBEGINDECLARE@start_of_end_dateDATETIME=@end_date_date--判断结束日期所在天是否是周末IFdbo.IsWeekend(@end_date)=1BEGINSET@weekend_seconds=@weekend_seconds+DATEDIFF(SECOND,@start_of_end_date,@end_date)ENDEND--3.处理中间整天IF@start_next_date<@end_date_dateBEGINDECLARE@mid_daysINT=DATEDIFF(DAY,@start_next_date,@end_date_date)--计算中间整天的周末天数DECLARE@mid_weekend_daysINT=0--计算完整周数DECLARE@weeksINT=@mid_days/7SET@mid_weekend_days=@weeks*2--剩余天数DECLARE@remaining_daysINT=@mid_days%7--计算剩余天数中的周末天数DECLARE@start_week_dayINT=(DATEDIFF(DAY,'1900-01-01',@start_next_date)%7)--0=周一,1=周二,...5=周六,6=周日DECLARE@iINT=0DECLARE@temp_dateDATETIME=@start_next_dateWHILE@i<@remaining_daysBEGIN--计算当前temp_date是星期几(0-6)DECLARE@week_dayINT=(DATEDIFF(DAY,'1900-01-01',@temp_date)%7)IF@week_dayIN(5,6)--5=周六,6=周日SET@mid_weekend_days=@mid_weekend_days+1SET@temp_date=DATEADD(DAY,1,@temp_date)SET@i=@i+1END--将中间整天的周末秒数加入SET@weekend_seconds=@weekend_seconds+@mid_weekend_days*86400ENDRETURN@total_seconds-@weekend_secondsENDGO注意:上面使用了循环处理剩余天数,但剩余天数最多6,所以可以接受。另外,我们假设1900-01-01是星期一。但是,这个函数中我们调用了一个函数IsWeekend?我们也可以内联判断。我们可以写一个内联的判断:--判断日期是否为周末的函数(内联)--使用基准日期1900-01-01(星期一):--(DATEDIFF(DAY,'1900-01-01',@date)%7)得到0-6,其中5,6为周末因此,我们可以将函数中的IsWeekend(@date)替换为:(DATEDIFF(DAY,'1900-01-01',@date)%7)IN(5,6)但是注意,@date是datetime,我们只关心日期部分,所以可以用CASTASDATE,但这里我们直接使用,因为DATEDIFF(DAY)会忽略时间部分。所以,修改后的代码:CREATEFUNCTIONdbo.GetWorkSeconds(@start_dateDATETIME,@end_dateDATETIME)RETURNSBIGINTASBEGINDECLARE@total_secondsBIGINTSET@total_seconds=DATEDIFF(SECOND,@start_date,@end_date)IF@total_seconds<=0RETURN0DECLARE@weekend_secondsBIGINTSET@weekend_seconds=0DECLARE@start_date_dateDATETIME=CAST(CAST(@start_dateASDATE)ASDATETIME)DECLARE@end_date_dateDATETIME=CAST(CAST(@end_dateASDATE)ASDATETIME)--1.处理开始日期所在天(部分天)DECLARE@start_next_dateDATETIME=DATEADD(DAY,1,@start_date_date)DECLARE@end_of_start_dateDATETIME=CASEWHEN@end_date<@start_next_dateTHEN@end_dateELSE@start_next_dateEND--判断开始日期所在天是否为周末:使用基准日期IF(DATEDIFF(DAY,'1900-01-01',@start_date_date)%7)IN(5,6)BEGINSET@weekend_seconds=@weekend_seconds+DATEDIFF(SECOND,@start_date,@end_of_start_date)END--2.处理结束日期所在天(部分天)IF@end_date_date<>@start_date_dateBEGIN--判断结束日期所在天是否为周末IF(DATEDIFF(DAY,'1900-01-01',@end_date_date)%7)IN(5,6)BEGINSET@weekend_seconds=@weekend_seconds+DATEDIFF(SECOND,@end_date_date,@end_date)ENDEND--3.处理中间整天IF@start_next_date<@end_date_dateBEGINDECLARE@mid_daysINT=DATEDIFF(DAY,@start_next_date,@end_date_date)DECLARE@weeksINT=@mid_days/7DECLARE@mid_weekend_daysINT=@weeks*2DECLARE@remaining_daysINT=@mid_days%7--循环处理剩余天数DECLARE@iINT=0DECLARE@temp_dateDATETIME=@start_next_dateWHILE@i<@remaining_daysBEGINIF(DATEDIFF(DAY,'1900-01-01',@temp_date)%7)IN(5,6)SET@mid_weekend_days=@mid_weekend_days+1SET@temp_date=DATEADD(DAY,1,@temp_date)SET@i=@i+1ENDSET@weekend_seconds=@weekend_seconds+@mid_weekend_days*86400ENDRETURN@total_seconds-@weekend_secondsENDGO测试:注意:1900-01-01是星期一,那么1900-01-06是星期六,1900-01-07是星期日。测试用例1:开始日期='1900-01-0600:00:00'(星期六),结束日期='1900-01-0612:00:00'(星期六)->应该减去12*3600=43200秒,所以返回0(因为总秒数=43200,减去43200=0)。测试用例2:开始日期='1900-01-0600:00:00'(星期六),结束日期='1900-01-0712:00:00'(星期日)->总秒数=(24+12)*3600=129600减去:第一天(周六)24小时=86400秒,第二天(周日)12小时=43200秒,总共129600秒,所以返回0。测试用例3:开始日期='1900-01-0512:00:00'(星期五),结束日期='1900-01-0612:00:00'(星期六)->总秒数=24*3600=86400减去:星期六从0点到12点:43200秒(注意:开始日期所在天(星期五)不是周末,所以只处理结束日期所在天(星期六)的部分:从0点到12点,43200秒。所以返回86400-43200=43200秒。测试用例4:开始日期='1900-01-0512:00:00'(星期五),结束日期='1900-01-0712:00:00'(星期日)->总秒数=48*3600=172800减去:星期六全天86400秒,星期日12小时43200秒,总共129600秒,所以返回43200秒。注意:在测试用例3中,我们只减去了结束日期所在天的部分(星期六0点到12点),没有减去星期六0点前的部分?因为我们只处理了结束日期所在天的部分(从0点到结束时间),而开始日期所在天(星期五)的部分中,星期五的12点到24点不是周末,所以不减去。测试用例5:开始日期='1900-01-0612:00:00'(星期六),结束日期='1900-01-0706:00:00'(星期日)->总秒数=(12+6)*3600=64800减去:开始日期所在天(星期六)从12:0024:0012*3600=43200秒结束日期所在天(星期日)从0:00到6:00:6*3600=21600秒总共64800秒,所以返回0。测试用例6:开始日期='1900-01-0412:00:00'(星期四),结束日期='1900-01-1112:00:00'(下周四)总秒数=7*86400=604800中间整天:从1900-01-05(周五)0:001900-01-11(周四)0:00,共6整天(5,6,7,8,9,10)其中,周六(6日)和周日(7日)两个整天,以及下周三(10日)之前,所以没有其他周末。另外,开始日期所在天(周四)不是周末,结束日期所在天(周四)不是周末。所以,减去:2*86400=172800秒,返回432000秒。但是,注意1900-01-11是周四,所以中间整天包括:1月5日(周五,非周末)、1月6日(周六)、1月7日(周日)、1月8日(周一)、1月9日(周二)、110日(周三)->周末只有6日和7日,共2天,正确。这个函数可以工作,但注意,如果两个日期相隔很远,循环部分(中间整天的剩余天数)最多6次,所以性能可以接受。但是,中间整天的计算中,循环从开始日期的下一天0点开始,循环remaining_days次(最多6次),所以没问题。但是,如果两个日期相隔多,mid_days可能很大,但循环次数最多6次(因为@remaining_days=@mid_days%7),所以循环次数最多6次,不会随着总天数增加而增加。因此,这个函数是高效的。最后,我们返回函数定义。注意:如果用户提供的开始日期大于结束日期,我们返回0(也可以返回负值,但这里我们返回0)。另外,我们使用了1900-01-01作为基准,这个基准在SQLServer中是星期一。如果用户需要,我们可以将这个基准写死,这样不受@@DATEFIRST影响。现在,我们提供这个函数给用户。但是,用户要求排除周末,我们这里只排除了周六和周日,没有考虑节假日。用户没有要求排除节假日,所以只排除周末。§§相关问题§§1.如何修改这个函数以排除节假日2.这个函数的性能如何?有没有优化空间?3.如果我想计算两个日期之间的工作日分钟数,如何修改?</think>### SQL Server 计算排除周末的秒数差 在 SQL Server 中计算两个日期之间的秒数差并排除周末(周六和周日),可通过以下步骤实现: #### 解决方案思路 1. **计算总秒数差**:使用 `DATEDIFF(SECOND, start_date, end_date)`。 2. **排除周末秒数**: - 识别时间段内所有周末(周六和周日)。 - 减去周末对应的总秒数(按整天或部分天精确计算)。 3. **分段处理**: - **开始日期部分天**:计算从开始时间到当日结束的秒数(若当天是周末)。 - **结束日期部分天**:计算从当日开始到结束时间的秒数(若当天是周末)。 - **中间整天**:直接减去完整的周末天数 × 86,400 秒。 --- #### 实现代码 ```sql CREATE FUNCTION dbo.GetSecondsExcludeWeekends ( @start_date DATETIME, @end_date DATETIME ) RETURNS BIGINT AS BEGIN DECLARE @total_seconds BIGINT = DATEDIFF(SECOND, @start_date, @end_date); IF @total_seconds <= 0 RETURN 0; DECLARE @weekend_seconds BIGINT = 0; DECLARE @start_date_date DATETIME = CAST(CAST(@start_date AS DATE) AS DATETIME); DECLARE @end_date_date DATETIME = CAST(CAST(@end_date AS DATE) AS DATETIME); -- 1. 处理开始日期部分天 DECLARE @start_next_date DATETIME = DATEADD(DAY, 1, @start_date_date); DECLARE @end_of_start_date DATETIME = CASE WHEN @end_date < @start_next_date THEN @end_date ELSE @start_next_date END; IF (DATEDIFF(DAY, '1900-01-01', @start_date_date) % 7) IN (5, 6) -- 5=周六,6=周日 BEGIN SET @weekend_seconds += DATEDIFF(SECOND, @start_date, @end_of_start_date); END -- 2. 处理结束日期部分天(排除与开始日期同天的情况) IF @end_date_date <> @start_date_date AND (DATEDIFF(DAY, '1900-01-01', @end_date_date) % 7) IN (5, 6) BEGIN SET @weekend_seconds += DATEDIFF(SECOND, @end_date_date, @end_date); END -- 3. 处理中间整天 IF @start_next_date < @end_date_date BEGIN DECLARE @mid_days INT = DATEDIFF(DAY, @start_next_date, @end_date_date); DECLARE @weeks INT = @mid_days / 7; DECLARE @mid_weekend_days INT = @weeks * 2; -- 每周2周末 DECLARE @remaining_days INT = @mid_days % 7; -- 计算剩余天数中的周末 DECLARE @temp_date DATETIME = @start_next_date; DECLARE @i INT = 0; WHILE @i < @remaining_days BEGIN IF (DATEDIFF(DAY, '1900-01-01', @temp_date) % 7) IN (5, 6) SET @mid_weekend_days += 1; SET @temp_date = DATEADD(DAY, 1, @temp_date); SET @i += 1; END SET @weekend_seconds += @mid_weekend_days * 86400; -- 整天秒数 END RETURN @total_seconds - @weekend_seconds; END GO ``` #### 使用示例 ```sql -- 测试:2023-10-07(周六)12:002023-10-08(周日)12:00(应返回0) SELECT dbo.GetSecondsExcludeWeekends('2023-10-07 12:00:00', '2023-10-08 12:00:00') AS WorkSeconds; -- 测试:2023-10-06(周五)12:002023-10-09(周一)12:00(应返回43200秒) SELECT dbo.GetSecondsExcludeWeekends('2023-10-06 12:00:00', '2023-10-09 12:00:00') AS WorkSeconds; ``` #### 关键说明 1. **基准日期 `1900-01-01`**:用于计算星期几(0=周一, 5=周六, 6=周日),不受 `@@DATEFIRST` 设置影响。 2. **部分天处理**: - 开始日期:计算从开始时间到当日结束或结束日期(取较早者)。 - 结束日期:仅处理与开始日期不同天的情况。 3. **中间整天优化**: - 整周数 × 2 直接计算周末天数。 - 剩余天数循环最多6次(高效)。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值