MySQL计算工作日(处理假期及加班)

1、创建一个表用于存储假期和调整的上班时间:holiday_of_china。

字段设计:日期(BDATE)、是否假期(HFLAG)、假期名称(NAME)

维护假期信息表,请求接口、手动维护都可以。主要是需标识出一年内的假期以及加班日,数据量一般就30至40条。hflag为true代表假期,false代表加班日。具体数据如下:

2、详细代码:

create PROCEDURE preworkdays(
    in myear nvarchar(20)
)
begin

    SELECT DISTINCT
    `part_all`.`bdate` AS `bdate` 
    FROM
        (
        SELECT
            cast( `part_a`.`bdate` AS CHAR ( 10 ) charset utf8mb4 ) AS `bdate` 
        FROM
            (
            SELECT
                `data_days`.`bdate` AS `bdate` 
            FROM
                (
                SELECT
                    concat( myear, '-12-31' ) - INTERVAL `a`.`a` + 10 * `b`.`a` + 100 * `c`.`a` DAY AS `bdate` 
                FROM
                    ((((
                                SELECT
                                    0 AS `a` 
                                    ) UNION ALL
                            SELECT
                                1 AS `1` UNION ALL
                            SELECT
                                2 AS `2` UNION ALL
                            SELECT
                                3 AS `3` UNION ALL
                            SELECT
                                4 AS `4` UNION ALL
                            SELECT
                                5 AS `5` UNION ALL
                            SELECT
                                6 AS `6` UNION ALL
                            SELECT
                                7 AS `7` UNION ALL
                            SELECT
                                8 AS `8` UNION ALL
                            SELECT
                                9 AS `9` 
                                ) `a`
                            JOIN (
                            SELECT
                                0 AS `a` UNION ALL
                            SELECT
                                1 AS `1` UNION ALL
                            SELECT
                                2 AS `2` UNION ALL
                            SELECT
                                3 AS `3` UNION ALL
                            SELECT
                                4 AS `4` UNION ALL
                            SELECT
                                5 AS `5` UNION ALL
                            SELECT
                                6 AS `6` UNION ALL
                            SELECT
                                7 AS `7` UNION ALL
                            SELECT
                                8 AS `8` UNION ALL
                            SELECT
                                9 AS `9` 
                            ) `b` 
                            )
                        JOIN (
                        SELECT
                            0 AS `a` UNION ALL
                        SELECT
                            1 AS `1` UNION ALL
                        SELECT
                            2 AS `2` UNION ALL
                        SELECT
                            3 AS `3` UNION ALL
                        SELECT
                            4 AS `4` UNION ALL
                        SELECT
                            5 AS `5` UNION ALL
                        SELECT
                            6 AS `6` UNION ALL
                        SELECT
                            7 AS `7` UNION ALL
                        SELECT
                            8 AS `8` UNION ALL
                        SELECT
                            9 AS `9` 
                        ) `c` 
                    )) `data_days` 
            WHERE
                `data_days`.`bdate` >= concat( myear, '-01-01' ) 
            AND `data_days`.`bdate` <= concat( myear, '-12-31' )) `part_a` 
        WHERE
            dayofweek( `part_a`.`bdate` ) NOT IN ( 1, 7 ) 
            AND !(
            `part_a`.`bdate` IN ( SELECT `HOLIDAY_OF_CHINA`.`BDATE` FROM `HOLIDAY_OF_CHINA` WHERE `HOLIDAY_OF_CHINA`.`BHOLIDAY` = 'True' )) UNION ALL
        SELECT
            `HOLIDAY_OF_CHINA`.`BDATE` AS `bdate` 
        FROM
            `HOLIDAY_OF_CHINA` 
        WHERE
            `HOLIDAY_OF_CHINA`.`BHOLIDAY` = 'False' 
            AND `HOLIDAY_OF_CHINA`.`BDATE` >= concat( myear, '-01-01' ) 
        AND `HOLIDAY_OF_CHINA`.`BDATE` <= concat( myear, '-12-31' )) `part_all` 
ORDER BY
    `part_all`.`bdate` DESC;
end;

3、调用:

call preworkdays('2023');
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL可以通过使用日期函数和自定义表来分工作日假期。 首先,我们可以使用MySQL的日期函数来获取工作日假期的信息。例如,我们可以使用WEEKDAY函数来获取给定日期是星期几,以确定是否为工作日。该函数返回的值从0到6,其中0表示星期一,1表示星期二,以此类推。我们还可以使用MONTH和YEAR函数来获取给定日期的月份和年份。 接下来,我们可以在MySQL中创建一个自定义的假期表,其中包含所有的假期日期。这个表可以包括日期和假期名称等列。我们可以使用INSERT语句将所有假期日期插入到假期表中。然后,可以使用JOIN语句将工作日表和假期表连接起来,以便在查询中过滤掉假期日期。 例如,假设有一个名为"dates"的表,包括一个"date"列,存储了需要判断的日期。假设还有一个名为"holidays"的表,包括一个"date"列存储假期日期,以及一个"name"列存储假期的名称。以下是一个示例查询,将"dates"表中的日期分为工作日假期: ``` SELECT dates.date, IF(holidays.date IS NULL, '工作日', holidays.name) AS type FROM dates LEFT JOIN holidays ON dates.date = holidays.date ``` 上述查询使用LEFT JOIN来将"dates"表和"holidays"表连接起来,根据日期进行匹配。通过判断"holidays.date"是否为空,可以确定每个日期是工作日还是假期。如果为空,则表示是工作日;否则,表示是假期,并将假期的名称存储在"type"列中。 通过这种方式,可以分工作日假期,并根据需要进行进一步的处理或统计。 ### 回答2: MySQL是一种流行的关系型数据库管理系统,可用于存储和管理各种数据。在MySQL中,可以使用日期函数来分别处理工作日假期。 要查询工作日,可以使用WEEKDAY函数。WEEKDAY函数返回指定日期的星期几,星期一到星期五被认为是工作日,星期六和星期日被认为是非工作日。所以,通过使用WEEKDAY函数,我们可以筛选出工作日的日期。 例如,假设我们有一个名为"dates"的日期字段,我们可以使用以下查询来找到工作日的日期: ``` SELECT date FROM table_name WHERE WEEKDAY(date) < 5; ``` 若要查询假期日期,我们可以使用日期函数和一个预定义的假期列表,来筛选出假期日期。 例如,假设我们有一个名为"holidays"的假期列表,其中包含所有的假期日期。我们可以使用以下查询来找到在假期列表中的日期: ``` SELECT date FROM table_name WHERE date IN (SELECT holiday_date FROM holidays); ``` 此外,我们还可以使用DATE_SUB和DATE_ADD函数来计算指定日期之前或之后的日期,以及使用DATEDIFF函数来计算两个日期之间的天数差。 总而言之,MySQL提供了强大的日期函数来处理工作日假期。使用这些函数,我们可以轻松地分离工作日假期,并进行相应的查询和计算。 ### 回答3: MySQL可以通过使用函数和表来区分工作日假期。下面是一个简单的方式来实现: 1. 创建一个表来存储所有的假期日期。表结构可以包括日期字段和假期名字字段。用户可以根据需要预先将假期日期添加到这个表中。 2. 创建一个函数来判断一个给定日期是否为工作日或者假期。这个函数可以接受一个日期作为参数,并返回一个布尔值表示该日期是否为工作日。在函数中,我们可以使用MySQL的内置函数来获取给定日期的星期几,再与假期表中的日期进行比较,根据结果返回布尔值。 示例代码如下: ```sql CREATE TABLE holidays ( holiday_date DATE PRIMARY KEY, holiday_name VARCHAR(255) ); INSERT INTO holidays VALUES ('2022-01-01', '元旦'); -- 添加更多假期日期 DELIMITER $$ CREATE FUNCTION is_workday(date_val DATE) RETURNS BOOLEAN BEGIN DECLARE is_holiday BOOLEAN; SET is_holiday = 0; -- 判断是否为假期 SELECT COUNT(*) INTO is_holiday FROM holidays WHERE holiday_date = date_val; -- 判断是否为周末 IF WEEKDAY(date_val) = 5 OR WEEKDAY(date_val) = 6 THEN SET is_holiday = 1; END IF; RETURN NOT is_holiday; END$$ DELIMITER ; -- 使用示例 SELECT is_workday('2022-01-01'); -- 返回0,因为元旦是假期 SELECT is_workday('2022-01-03'); -- 返回1,因为这是工作日 ``` 通过上述方法,我们可以方便地区分MySQL中的日期是工作日还是假期。用户也可以根据实际情况修改和扩展这个函数和假期表,以适应不同的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值