需求

计算两个日期的差,并且需要排除节假日。

首先,我们需要准备一张节假日表,存放一年里所有的周末和法定节假日。

实现下面两个需求:

1、通过主表的两个日期字段,去计算这两个字段的日期差值;

2、传入两个日期,去计算这两个日期的差值;

通过主表的两个日期字段,去计算这两个字段的日期差值

主表

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 tLEFT JOIN sys_holiday a on date(start_time) = a.dateLEFT JOIN sys_holiday b on date(end_time) = b.date
) z

SQL解释

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(-- 结果 = 用总时间差 - 节假日的天数 -(开始时间是假期)开始时间到第二天0点的差值 + (结束时间是假期)结束时间到第二天0点的差值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) -- 如果开始时间这天是假期的话,计算它的时间和第二天0点之间的差值- TIMESTAMPDIFF(SECOND, start_time, IFNULL(DATE_ADD(a.date,INTERVAL 1 DAY), start_time)) -- 如果结束时间这天是假期的话,计算它的时间和第二天0点之间的差值+ TIMESTAMPDIFF(SECOND, end_time, IFNULL(DATE_ADD(b.date,INTERVAL 1 DAY), end_time)) as secondcount FROM test tLEFT JOIN sys_holiday a on date(start_time) = a.date -- start_time格式到天和节假日表关联,如果 a.date 不是null,说明start_time这一天是节假日LEFT JOIN sys_holiday b on date(end_time) = b.date  -- end_time格式到天和节假日表关联,如果 b.date 不是null,说明end_time这一天是节假日) z为什么开始时间是假期就要减去,而结束时间是假期就要加上呢?
(select count(*) from sys_holiday where date < end_time and date >= start_time) 这一句就是查询 (开始时间 <= date < 结束时间) 这个范围的天数。因为每个假期都是从这一天的0点开始的,而 (开始时间 <= date) 这个条件是查不到开始时间当天的,所以需要单独减去。比如开始时间是2022-11-12 12:10:11,结束时间是2022-11-13 12:10:11,这两天都是周六日,但这句查询查的天数只有一天,就是13号这天;
因此,开始时间是假期的话,它后面的时间一直到第二天0点,都需要减去;
而结束时间是假期的话,它后面的时间一直到第二天0点,是不算在节假日里面的(因为后面的时间不在开始和结束时间这个范围),前面是算的13号这一整天的秒数,实际上12:10:11以后的时间,是不在区间范围的,所以要把这个非范围内的秒数给重新加上去。


这整句计算的SQL大概是这么个意思,不理解的可以把我标注的1、2、3这几句单独拿出来查询一遍看看,再照着我的解释理一遍。

执行结果

校验

SELECT TIMESTAMPDIFF(SECOND,'2021-12-01 12:50:27','2021-12-04 00:00:00') id1, -- 212973TIMESTAMPDIFF(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, -- 120728TIMESTAMPDIFF(SECOND,'2022-01-10 07:20:06','2022-01-11 22:55:13') id5, -- 142507TIMESTAMPDIFF(SECOND,'2021-12-27 00:00:00','2021-12-28 16:55:25') id6  -- 147325

传入两个日期作为参数,计算它们的差值;

set @startTime='2022-11-10 10:11:23';
set @endTime='2022-11-13 14:11:23';SELECT *,总时差 - 节假日的秒数 - 开始时间的差值 + 结束时间的差值 AS 结果
FROM(SELECT TIMESTAMPDIFF(SECOND,@startTime,@endTime) 总时差,(select count(*) from sys_holiday where date < @endTime and date >= @startTime) * 24 * 60 * 60 AS 节假日的秒数,CASE WHEN date(@startTime)=(SELECT date FROM sys_holiday WHERE date(@startTime)=date) THEN TIMESTAMPDIFF(SECOND, @startTime, DATE_ADD(date(@startTime),INTERVAL 1 DAY)) ELSE 0 END  开始时间的差值,CASE WHEN date(@endTime)=(SELECT date FROM sys_holiday WHERE date(@endTime)=date) THEN TIMESTAMPDIFF(SECOND, @endTime, DATE_ADD(date(@endTime),INTERVAL 1 DAY)) ELSE 0 END  结束时间的差值
) a

@startTime、@endTime就是传进来的开始、结束时间,用这两个时间在 sys_holiday 节假日表直接按条件查询即可。总时差、节假日的秒数、开始时间的差值、结束时间的差值 这四个值的计算方式和前面的一样,就是把前面的那个查询语句拆开来了而已,它们的意思也是和我上面解释的一样。

最后

如果数据多了,查询会比较慢

暂时想不出要怎么优化,又或者有什么其他方法来排除节假日。有小伙伴知道的话欢迎留言~

MySQL排除节假日,计算日期差相关推荐

  1. MYSQL计算日期差和时间差的函数

    DATEDIFF:只计算日期差,精确到天数. 用法:DATEDIFF('2015-04-22 23:59:00', '2015-04-20 00:00:00') TIMESTAMPDIFF:可以计算日 ...

  2. php 校准系统时间,php计算日期差-在线时间校准网

    您的位置:在线时间校准网 >> 有关时间的问题 >> php计算日期差 php计算日期差-在线时间校准网php计算日期差_IT/计算机_专业资料.php日期函数用法,php计算 ...

  3. (C++)设计一个程序能计算一个日期加上若干天后是什么日期and计算日期差值

    输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数. 输出m行,每行按yyyy-mm-dd的个数输出. #include<cstdio>//判断是否是闰年 bool ...

  4. 计算日期差的方法c语言,C语言计算日期差的方法示例

    本文实例讲述了C语言计算日期差的方法.分享给大家供大家参考,具体如下: 历史上,不同的人类聚居地可能有不同的历法,因而记录下来的资料中日期的换算就很麻烦.幸好今天我们统一使用公元纪年法.当然,这种历法 ...

  5. javascript 日期计算器 推算几天后的日期 计算日期差

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  6. SHELL脚本下获取文件时间转换时间戳,使用时间戳计算日期差

    SHELL脚本下获取文件时间使用时间戳计算日期差 获取时间戳按秒计算 获取 LINUX获取当前时间的时间戳 获取文件的时间戳 计算 获取时间戳按秒计算 获取 LINUX获取当前时间的时间戳 #确认时间 ...

  7. lua 计算日期差值 计算时间戳日期差

    lua 计算日期差值 背景:最近接触的项目在用lua所以也来发一个 可能其他朋友需要的function 不废话 ,上代码,需要的小伙伴拿去吧,如果还有小伙伴有更好的方案可以. 此方案也是从网络上搜到的 ...

  8. SVG排版公众号图文『实时计算日期差』模板代码

    模板效果 SVG排版公众号图文『实时计算日期差』模版代码 模板代码 svg代码 <svg data-author="懂点君" version="1.1" ...

  9. android中计算日期差,Android编程实现根据不同日期计算天数差的方法

    本文实例讲述了Android编程实现根据不同日期计算天数差的方法.分享给大家供大家参考,具体如下: Calendar cal1 = getCalendarFromDate(mStartDate); l ...

最新文章

  1. spring-cloud:熔断监控Hystrix Dashboard和Turbine的示例
  2. kernel笔记——中断
  3. supervisor
  4. 【毕业求职季】-听说你想去大厂看学妹,带你看看腾讯微信产品岗面经(已offer)
  5. 多线程学习(二)----AfxBeginThread
  6. Java中的ClassLoader
  7. 【今日CV 视觉论文速览】 17 Dec 2018
  8. 系统调用----sandir
  9. 利尔达NB-IOT的PSM和eDRX低功耗模式笔记
  10. Android基础:Android布局
  11. 经典场效应管如何快速关断技巧-KIA MOS管
  12. CS书籍、代码资源下载网址
  13. 数控弯管机xyz转换ybc的算法_一种弯管数控数模到CAD数模转换的方法与流程
  14. 程序员转行,干什么比较好
  15. 饭店计算机信息管理全章ppt,酒店信息质量管理.ppt
  16. Aria2打造离线网盘
  17. OCR目标识别(车辆VIN码识别效果)
  18. Zadig 构建效率提升 40% 背后的实践思路
  19. 面向对象的C++了解
  20. 批量修改文件后缀名(扩展名格式),操作简单1行命令搞定!

热门文章

  1. uniapp做小程序的图片(视频)上传的组件封装
  2. C++中野指针产生的途径?避免野指针产生的方法。
  3. PHP CURL 请求
  4. 18-25岁女性7成是大叔控 广东剩男比剩女多165万
  5. 缘起缘灭黑胶碟 剩男剩女犬作伐
  6. GJB 5000B二级-DEM立项论证
  7. mysql-审计功能
  8. Linux三剑客之grep命令详解及相关实例
  9. bash有意思的记录
  10. js之onreadystatechange事件