MySQL排除节假日,计算日期差

计算两个日期的差,并且需要排除节假日。需要两张表,一张是主表,需要计算日期差的表;一张是节假日表,存放法定节假日和周末的表。

主表

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `start_time` datetime NULL DEFAULT NULL,
  `end_time` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;

INSERT INTO `test` VALUES (1, '2021-12-01 12:50:27', '2021-12-04 12:53:38');
INSERT INTO `test` VALUES (2, '2021-12-03 08:22:11', '2021-12-06 17:54:19');
INSERT INTO `test` VALUES (3, '2022-01-01 09:54:28', '2022-01-02 19:50:31');
INSERT INTO `test` VALUES (4, '2021-12-10 13:53:34', '2021-12-25 23:50:55');
INSERT INTO `test` VALUES (5, '2022-01-10 07:20:06', '2022-01-11 22:55:13');
INSERT INTO `test` VALUES (6, '2021-12-26 16:10:17', '2021-12-28 16:55:25');
INSERT INTO `test` VALUES (7, '2021-12-27 20:55:35', '2022-01-02 17:35:43');
INSERT INTO `test` VALUES (8, '2022-01-12 21:35:49', '2022-01-16 14:22:54');

节假日表(有21年和22年的节假日)

DROP TABLE IF EXISTS `sys_holiday`;
CREATE TABLE `sys_holiday`  (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `date` datetime NULL DEFAULT NULL COMMENT '日期',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '节日名称',
  `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '节假日类型(0 工作日、1 周末、2 节日、3 调休)',
  `week` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '1 - 7,分别表示 周一 至 周日',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '节假日表' ROW_FORMAT = DYNAMIC;

INSERT INTO `sys_holiday` VALUES (1, '2022-06-04 00:00:00', '端午节', '2', '6');
INSERT INTO `sys_holiday` VALUES (2, '2022-08-06 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (3, '2022-02-20 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (4, '2021-10-03 00:00:00', '国庆节', '2', '7');
INSERT INTO `sys_holiday` VALUES (5, '2021-09-20 00:00:00', '中秋节', '2', '1');
INSERT INTO `sys_holiday` VALUES (6, '2022-12-10 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (7, '2021-06-13 00:00:00', '端午节', '2', '7');
INSERT INTO `sys_holiday` VALUES (8, '2022-06-25 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (9, '2022-01-08 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (10, '2021-10-01 00:00:00', '国庆节', '2', '5');
INSERT INTO `sys_holiday` VALUES (11, '2022-06-18 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (12, '2022-12-04 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (13, '2022-05-28 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (14, '2021-05-16 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (15, '2021-10-02 00:00:00', '国庆节', '2', '6');
INSERT INTO `sys_holiday` VALUES (16, '2022-04-04 00:00:00', '清明节', '2', '1');
INSERT INTO `sys_holiday` VALUES (17, '2022-05-08 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (18, '2022-09-24 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (19, '2022-01-03 00:00:00', '元旦', '2', '1');
INSERT INTO `sys_holiday` VALUES (20, '2021-03-13 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (21, '2021-04-04 00:00:00', '清明节', '2', '7');
INSERT INTO `sys_holiday` VALUES (22, '2021-01-10 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (23, '2021-04-03 00:00:00', '清明节', '2', '6');
INSERT INTO `sys_holiday` VALUES (24, '2022-10-03 00:00:00', '国庆节', '2', '1');
INSERT INTO `sys_holiday` VALUES (25, '2021-01-24 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (26, '2021-02-16 00:00:00', '初五', '2', '2');
INSERT INTO `sys_holiday` VALUES (27, '2022-03-13 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (28, '2021-05-30 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (29, '2022-11-26 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (30, '2021-01-02 00:00:00', '元旦', '2', '6');
INSERT INTO `sys_holiday` VALUES (31, '2022-05-03 00:00:00', '劳动节', '2', '2');
INSERT INTO `sys_holiday` VALUES (32, '2022-05-15 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (33, '2021-02-28 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (34, '2021-08-15 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (35, '2021-04-11 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (36, '2021-07-11 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (37, '2021-01-03 00:00:00', '元旦', '2', '7');
INSERT INTO `sys_holiday` VALUES (38, '2021-08-29 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (39, '2022-05-21 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (40, '2022-11-20 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (41, '2021-03-27 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (42, '2022-01-31 00:00:00', '除夕', '2', '1');
INSERT INTO `sys_holiday` VALUES (43, '2022-07-09 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (44, '2022-02-26 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (45, '2022-11-12 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (46, '2022-06-11 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (47, '2022-12-18 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (48, '2022-09-17 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (49, '2022-08-07 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (50, '2021-08-21 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (51, '2021-06-12 00:00:00', '端午节', '2', '6');
INSERT INTO `sys_holiday` VALUES (52, '2021-01-23 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (53, '2022-04-09 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (54, '2021-11-14 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (55, '2021-09-19 00:00:00', '中秋节', '2', '7');
INSERT INTO `sys_holiday` VALUES (56, '2021-09-05 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (57, '2022-07-16 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (58, '2022-03-05 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (59, '2022-06-12 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (60, '2022-02-19 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (61, '2021-02-14 00:00:00', '初三', '2', '7');
INSERT INTO `sys_holiday` VALUES (62, '2021-01-09 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (63, '2022-10-06 00:00:00', '国庆节', '2', '4');
INSERT INTO `sys_holiday` VALUES (64, '2022-07-10 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (65, '2021-12-12 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (66, '2022-03-06 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (67, '2022-04-16 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (68, '2021-10-24 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (69, '2021-10-16 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (70, '2022-06-03 00:00:00', '端午节', '2', '5');
INSERT INTO `sys_holiday` VALUES (71, '2022-10-02 00:00:00', '国庆节', '2', '7');
INSERT INTO `sys_holiday` VALUES (72, '2021-10-06 00:00:00', '国庆节', '2', '3');
INSERT INTO `sys_holiday` VALUES (73, '2021-09-11 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (74, '2022-02-06 00:00:00', '初六', '2', '7');
INSERT INTO `sys_holiday` VALUES (75, '2021-02-13 00:00:00', '初二', '2', '6');
INSERT INTO `sys_holiday` VALUES (76, '2022-09-03 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (77, '2021-03-21 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (78, '2022-07-24 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (79, '2021-07-03 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (80, '2021-07-31 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (81, '2021-06-20 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (82, '2021-02-27 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (83, '2021-08-22 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (84, '2021-03-06 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (85, '2022-02-03 00:00:00', '初三', '2', '4');
INSERT INTO `sys_holiday` VALUES (86, '2022-04-30 00:00:00', '劳动节', '2', '6');
INSERT INTO `sys_holiday` VALUES (87, '2021-06-19 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (88, '2021-07-25 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (89, '2022-12-25 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (90, '2021-12-18 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (91, '2022-11-27 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (92, '2022-04-17 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (93, '2021-05-01 00:00:00', '劳动节', '2', '6');
INSERT INTO `sys_holiday` VALUES (94, '2022-04-23 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (95, '2022-10-15 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (96, '2022-01-02 00:00:00', '元旦', '2', '7');
INSERT INTO `sys_holiday` VALUES (97, '2021-12-05 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (98, '2021-07-04 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (99, '2022-09-25 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (100, '2022-03-12 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (101, '2021-09-21 00:00:00', '中秋节', '2', '2');
INSERT INTO `sys_holiday` VALUES (102, '2021-09-25 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (103, '2022-06-19 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (104, '2022-12-24 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (105, '2022-01-09 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (106, '2022-10-16 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (107, '2021-02-12 00:00:00', '初一', '2', '5');
INSERT INTO `sys_holiday` VALUES (108, '2022-07-31 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (109, '2022-08-21 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (110, '2021-05-02 00:00:00', '劳动节', '2', '7');
INSERT INTO `sys_holiday` VALUES (111, '2022-07-17 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (112, '2021-08-08 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (113, '2022-01-01 00:00:00', '元旦', '2', '6');
INSERT INTO `sys_holiday` VALUES (114, '2021-11-28 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (115, '2021-07-24 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (116, '2022-01-22 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (117, '2021-11-13 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (118, '2021-06-14 00:00:00', '端午节', '2', '1');
INSERT INTO `sys_holiday` VALUES (119, '2021-10-04 00:00:00', '国庆节', '2', '1');
INSERT INTO `sys_holiday` VALUES (120, '2022-12-17 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (121, '2021-03-20 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (122, '2022-12-31 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (123, '2021-11-27 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (124, '2021-07-17 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (125, '2022-02-27 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (126, '2021-04-17 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (127, '2021-11-06 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (128, '2021-10-05 00:00:00', '国庆节', '2', '2');
INSERT INTO `sys_holiday` VALUES (129, '2021-10-30 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (130, '2022-11-19 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (131, '2021-03-14 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (132, '2021-04-10 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (133, '2022-09-18 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (134, '2021-02-17 00:00:00', '初六', '2', '3');
INSERT INTO `sys_holiday` VALUES (135, '2021-06-05 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (136, '2021-05-04 00:00:00', '劳动节', '2', '2');
INSERT INTO `sys_holiday` VALUES (137, '2022-05-14 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (138, '2022-05-04 00:00:00', '劳动节', '2', '3');
INSERT INTO `sys_holiday` VALUES (139, '2022-02-13 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (140, '2022-12-03 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (141, '2021-06-27 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (142, '2021-10-23 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (143, '2022-11-13 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (144, '2021-05-29 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (145, '2022-08-13 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (146, '2022-11-06 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (147, '2022-05-02 00:00:00', '劳动节', '2', '1');
INSERT INTO `sys_holiday` VALUES (148, '2021-04-18 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (149, '2021-05-23 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (150, '2021-01-01 00:00:00', '元旦', '2', '5');
INSERT INTO `sys_holiday` VALUES (151, '2022-12-11 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (152, '2021-02-21 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (153, '2021-05-09 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (154, '2022-03-20 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (155, '2022-03-26 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (156, '2022-05-22 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (157, '2021-06-06 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (158, '2022-10-23 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (159, '2022-10-29 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (160, '2021-02-06 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (161, '2022-07-02 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (162, '2022-10-04 00:00:00', '国庆节', '2', '2');
INSERT INTO `sys_holiday` VALUES (163, '2021-08-14 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (164, '2022-04-03 00:00:00', '清明节', '2', '7');
INSERT INTO `sys_holiday` VALUES (165, '2022-03-19 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (166, '2021-11-07 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (167, '2022-04-10 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (168, '2022-10-22 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (169, '2021-08-01 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (170, '2021-11-20 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (171, '2021-03-28 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (172, '2022-09-11 00:00:00', '中秋节', '2', '7');
INSERT INTO `sys_holiday` VALUES (173, '2021-01-16 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (174, '2022-07-23 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (175, '2021-12-04 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (176, '2022-07-30 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (177, '2021-07-10 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (178, '2022-02-12 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (179, '2021-08-28 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (180, '2021-08-07 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (181, '2021-12-11 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (182, '2021-05-03 00:00:00', '劳动节', '2', '1');
INSERT INTO `sys_holiday` VALUES (183, '2021-10-10 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (184, '2021-01-31 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (185, '2022-02-05 00:00:00', '初五', '2', '6');
INSERT INTO `sys_holiday` VALUES (186, '2021-10-17 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (187, '2022-06-26 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (188, '2022-09-04 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (189, '2022-01-16 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (190, '2022-03-27 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (191, '2022-02-04 00:00:00', '初四', '2', '5');
INSERT INTO `sys_holiday` VALUES (192, '2021-05-15 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (193, '2022-07-03 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (194, '2021-05-22 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (195, '2021-07-18 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (196, '2021-04-24 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (197, '2021-12-19 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (198, '2021-03-07 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (199, '2021-06-26 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (200, '2021-02-11 00:00:00', '除夕', '2', '4');
INSERT INTO `sys_holiday` VALUES (201, '2021-12-26 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (202, '2022-10-05 00:00:00', '国庆节', '2', '3');
INSERT INTO `sys_holiday` VALUES (203, '2022-09-12 00:00:00', '中秋节', '2', '1');
INSERT INTO `sys_holiday` VALUES (204, '2022-10-01 00:00:00', '国庆节', '2', '6');
INSERT INTO `sys_holiday` VALUES (205, '2022-10-07 00:00:00', '国庆节', '2', '5');
INSERT INTO `sys_holiday` VALUES (206, '2022-06-05 00:00:00', '端午节', '2', '7');
INSERT INTO `sys_holiday` VALUES (207, '2022-04-05 00:00:00', '清明节', '2', '2');
INSERT INTO `sys_holiday` VALUES (208, '2022-08-20 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (209, '2022-02-02 00:00:00', '初二', '2', '3');
INSERT INTO `sys_holiday` VALUES (210, '2022-09-10 00:00:00', '中秋节', '2', '6');
INSERT INTO `sys_holiday` VALUES (211, '2021-10-07 00:00:00', '国庆节', '2', '4');
INSERT INTO `sys_holiday` VALUES (212, '2021-09-12 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (213, '2021-11-21 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (214, '2022-01-23 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (215, '2021-04-05 00:00:00', '清明节', '2', '1');
INSERT INTO `sys_holiday` VALUES (216, '2021-01-30 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (217, '2022-11-05 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (218, '2022-08-27 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (219, '2021-09-04 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (220, '2021-10-31 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (221, '2021-12-25 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (222, '2022-05-29 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (223, '2022-02-01 00:00:00', '初一', '2', '2');
INSERT INTO `sys_holiday` VALUES (224, '2022-08-14 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (225, '2022-01-15 00:00:00', '周六', '1', '6');
INSERT INTO `sys_holiday` VALUES (226, '2021-05-05 00:00:00', '劳动节', '2', '3');
INSERT INTO `sys_holiday` VALUES (227, '2022-05-01 00:00:00', '劳动节', '2', '7');
INSERT INTO `sys_holiday` VALUES (228, '2022-10-30 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (229, '2021-01-17 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (230, '2022-08-28 00:00:00', '周日', '1', '7');
INSERT INTO `sys_holiday` VALUES (231, '2021-02-15 00:00:00', '初四', '2', '1');

排除节假日,计算日期差

SELECT id,start_time,end_time,secondcount,
CONCAT(FLOOR(secondcount/(3600*24)), '天', FLOOR(secondcount%(3600*24)/3600), '时', FLOOR((secondcount%3600)/60), '分', FLOOR(secondcount%3600%60), '秒') workTime
FROM(
	SELECT t.id,start_time,end_time,
	(TIMESTAMPDIFF(SECOND,start_time,end_time) - (select count(*) from sys_holiday where date < end_time and date >= start_time) * 24 * 60 * 60) 
	- TIMESTAMPDIFF(SECOND, start_time, IFNULL(DATE_ADD(a.date,INTERVAL 1 DAY), start_time)) 
	+ TIMESTAMPDIFF(SECOND, end_time, IFNULL(DATE_ADD(b.date,INTERVAL 1 DAY), end_time)) as secondcount 
	FROM test t
	LEFT JOIN sys_holiday a on date(start_time) = a.date
	LEFT JOIN sys_holiday b on date(end_time) = b.date 
) z

执行结果

在这里插入图片描述

校验

SELECT TIMESTAMPDIFF(SECOND,'2021-12-01 12:50:27','2021-12-04 00:00:00') id1, -- 212973
	   TIMESTAMPDIFF(SECOND,'2021-12-03 08:22:11','2021-12-04 00:00:00')+TIMESTAMPDIFF(SECOND,'2021-12-06 00:00:00','2021-12-06 17:54:19') id2, -- 120728
	   TIMESTAMPDIFF(SECOND,'2022-01-10 07:20:06','2022-01-11 22:55:13') id5, -- 142507
	   TIMESTAMPDIFF(SECOND,'2021-12-27 00:00:00','2021-12-28 16:55:25') id6  -- 147325

在这里插入图片描述

最后

如果数据多了,查询会比较慢
在这里插入图片描述
暂时想不出要怎么优化,又或者有什么其他方法来排除节假日。有小伙伴知道的话欢迎留言~

猜你喜欢

转载自blog.csdn.net/weixin_43165220/article/details/122453242