Heim >Datenbank >MySQL-Tutorial >SQL实现工作日计算_MySQL

SQL实现工作日计算_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 13:44:211508Durchsuche

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
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn