Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7484185
  • 博文数量: 368
  • 博客积分: 9600
  • 博客等级: 上校
  • 技术积分: 18875
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-01 00:00
文章分类

全部博文(368)

文章存档

2017年(9)

2016年(19)

2015年(3)

2014年(6)

2013年(8)

2012年(78)

2011年(66)

2010年(135)

2009年(44)

分类: Mysql/postgreSQL

2012-10-09 12:03:07

    今天遇到运营那边有个需求,需要找出注册用户排除周六周日的每日打卡情况(包含不是周六周日的当天),当时的第一反应是想找一个能实现排除周六周日能计算到月底还有多少工作日的函数,找了半天没找到,还是自己写一个吧。我崇拜的王大哥也写了一个,贴出来和大家分享。代码如下:
 

点击(此处)折叠或打开

  1. DROP FUNCTION IF EXISTS count_day_left ;
  2. DELIMITER //
  3. CREATE FUNCTION count_day_left( f_date DATETIME )
  4. RETURNS INT
  5. DETERMINISTIC
  6. BEGIN
  7. /*
  8.     Purpose: 统计指定日期距离月底还有多少个工作日,节假日未排除,用于打卡统计的过滤函数
  9.     Author: 飞鸿无痕
  10.     Date: 2012-10-09
  11.     Useage: select count_day_left('2012-09-10');
  12. */
  13.   DECLARE start_day INT;
  14.   DECLARE end_day INT;
  15.   DECLARE count_day INT DEFAULT 0;
  16.   DECLARE tmp_date DATE DEFAULT DATE(f_date);
  17.   SET end_day=DAY(LAST_DAY(f_date));
  18.   SET start_day=DAY(f_date);
  19.   WHILE start_day<=end_day DO
  20.         IF ( (DAYOFWEEK(tmp_date) = 1) OR (DAYOFWEEK(tmp_date) = 7)) THEN
  21.             SET tmp_date=DATE_ADD(tmp_date,INTERVAL 1 DAY);
  22.             SET start_day=start_day+1;
  23.         ELSE
  24.         SET tmp_date=DATE_ADD(tmp_date,INTERVAL 1 DAY);
  25.         SET start_day=start_day+1;
  26.         SET count_day=count_day+1;
  27.         END IF;

  28.   END WHILE;
  29.   RETURN count_day;
  30. END //
  31. DELIMITER ;

点击(此处)折叠或打开

  1. DROP FUNCTION IF EXISTS count_day_left;
  2. DELIMITER //
  3. CREATE FUNCTION count_day_left(f_date DATE)
  4. RETURNS INT
  5. READS SQL DATA
  6. BEGIN
  7. 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);
  8. END //
  9. DELIMITER ;

阅读(45187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~