統計當前日期距離月底有多少工作日的函數
今天遇到運營那邊有個需求,需要找出注冊用戶排除周六周日的每日打卡情況(包含不是周六周日的當天),當時的第一反應是想找一個能實現排除周六周日能計算到月底還有多少工作日的函數,找了半天沒找到,還是自己寫一個吧。我崇拜的王大哥也寫了一個,貼出來和大家分享。代碼如下:
www.2cto.com
DROP FUNCTION IF EXISTS count_day_left ;
DELIMITER //
CREATE FUNCTION count_day_left( f_date DATETIME )
RETURNS INT
DETERMINISTIC
BEGIN
/*
Purpose: 統計指定日期距離月底還有多少個工作日,節假日未排除,用於打卡統計的過濾函數
Useage: select count_day_left('2012-09-10');
*/
DECLARE start_day INT;
DECLARE end_day INT;
DECLARE count_day INT DEFAULT 0;
DECLARE tmp_date DATE DEFAULT DATE(f_date);
SET end_day=DAY(LAST_DAY(f_date));
SET start_day=DAY(f_date);
WHILE start_day<=end_day DO
IF ( (DAYOFWEEK(tmp_date) = 1) OR (DAYOFWEEK(tmp_date) = 7)) THEN
SET tmp_date=DATE_ADD(tmp_date,INTERVAL 1 DAY);
SET start_day=start_day+1;
ELSE
SET tmp_date=DATE_ADD(tmp_date,INTERVAL 1 DAY);
SET start_day=start_day+1;
SET count_day=count_day+1;
END IF;
END WHILE;
RETURN count_day;
END //
DELIMITER ;
www.2cto.com
DROP FUNCTION IF EXISTS count_day_left;
DELIMITER //
CREATE FUNCTION count_day_left(f_date DATE)
RETURNS INT
READS SQL DATA
BEGIN
RETURN DATEDIFF(LAST_DAY(f_date),f_date)-(WEEK(LAST_DAY(f_date))-WEEK(f_date))*2+IF(WEEKDAY(f_date)=6,0,1)-IF(WEEKDAY(LAST_DAY(f_date))=5,1,0);
END //
DELIMITER ;