您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

SQL实现工作日计算_MySQL

2024/12/14 13:51:38发布17次查看
bitscn.com
create function time_span_of_minutes(  
start_day datetime,  
end_day datetime)  
returns float 
begin 
            -- 返回按分钟计算两段时间的间隔,采用逐日靠近的方法求解,一天按8小时480分钟计算,周末不计,不考虑法定节假日。  
            -- 如果起始日期在周末,则计算当天时间。  
            declare minutes float;   
            declare next_day datetime;  
            set minutes=0.0;  
            set next_day=start_day;
if(timestampdiff(day,start_day,end_day)
                    set minutes=minutes+timestampdiff(minute,start_day,end_day);  
            else 
                    while timestampdiff(day,next_day,end_day)>=1.0 do  
                            if ((dayofweek(next_day)=7) or (dayofweek(next_day)=1)) then 
                                    set next_day=next_day+interval 1 day;  
                            else 
                                    set next_day=next_day+interval 1 day;  
                                    set minutes=minutes+480.0;  
                            end if;  
                    end while;  
                    set minutes=minutes+timestampdiff(minute,next_day,end_day);  
                    if ((dayofweek(start_day)=7) or (dayofweek(start_day)=1)) then 
                            set minutes=minutes+timestampdiff(minute,start_day,convert(concat(substring(start_day from 1 for 10),' 17:30:00'),datetime));  
                    end if;  
            end if;  
            return minutes;  
end;
create function time_span_of_minutes(
start_day datetime,
end_day datetime)
returns float
begin
                     -- 返回按分钟计算两段时间的间隔,采用逐日靠近的方法求解,一天按8小时480分钟计算,周末不计,不考虑法定节假日。
                     -- 如果起始日期在周末,则计算当天时间。
                     declare minutes float;
                     declare next_day datetime;
                     set minutes=0.0;
                     set next_day=start_day;
if(timestampdiff(day,start_day,end_day)
                                   set minutes=minutes+timestampdiff(minute,start_day,end_day);
                     else
                                   while timestampdiff(day,next_day,end_day)>=1.0 do
                                                 if ((dayofweek(next_day)=7) or (dayofweek(next_day)=1)) then
                                                               set next_day=next_day+interval 1 day;
                                                 else
                                                               set next_day=next_day+interval 1 day;
                                                               set minutes=minutes+480.0;
                                                 end if;
                                   end while;
                                   set minutes=minutes+timestampdiff(minute,next_day,end_day);
                                   if ((dayofweek(start_day)=7) or (dayofweek(start_day)=1)) then
                                                 set minutes=minutes+timestampdiff(minute,start_day,convert(concat(substring(start_day from 1 for 10),' 17:30:00'),datetime));
                                   end if;
                     end if;
                     return minutes;
end;
 没考虑中午休息时间
摘自 jasper键盘舞步
bitscn.com
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product