2010-04-06 4 views
1

방금 ​​두 날짜 사이의 근무일을 계산하는 저장 함수를 작성했습니다. 이 (이mysql 함수 사용 저장

이 CountWeekDays을 선택 작동하지 않습니다

이 CountWeekDays를 ('2010-03-07', '2010-04-07')

선택 작동 o.order_date, o.created_date) 에서 주문 o;

이 아이디어를 만드는 방법에 대한 아이디어가 있으십니까 ??

함수 정의

구분 $$; 함수 CountWeekDays (sdate가 VARCHAR (50) EDATE는 VARCHAR (50)) 복귀 INT

DECLARE의 wdays, tdiff, 카운터 thisday SMALLINT를 BEGIN CREATE

;

DECLARE newdate DATE;

SET newdate : = sdate;

SET wdays = 0;

DATEDIFF (edate, sdate) = 0 인 경우RETURN 1; END IF;

if DATEDIFF (edate, sdate) < 0 그 후 RETURN 0; END IF;

LABEL1 : LOOP

SET의 thisday = DAYOFWEEK (newdate);

오늘 2 일과 6 일 사이에 설정할 경우 wdays : = wdays +1; END IF;

SET newdate = DATE_ADD (newdate, INTERVAL 1 DAY);

IF DATEDIFF (edate, newdate) < 0 그 후 LEAVE label1; END IF;

end loop label1;

돌아 가기 wdays;

END

+0

o.order_date 및 o.created_date의 열 유형은 무엇입니까? – Andy

+0

@Andy datetime – shikhar

답변

0

데이터 유형과 관련이 있습니다.

SET GLOBAL log_bin_trust_function_creators=1; 
DROP FUNCTION IF EXISTS BizDaysInclusive; 
DELIMITER | 
CREATE FUNCTION BizDaysInclusive(d1 DATE, d2 DATE) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
DECLARE dow1, dow2, days INT; 
SET dow1 = DAYOFWEEK(d1); 
SET dow2 = DAYOFWEEK(d2); 
SET days = FLOOR(DATEDIFF(d2,d1)/7) * 5 + 
CASE 
WHEN dow1=1 AND dow2=7 THEN 5 
WHEN dow1 IN(7,1) AND dow2 IN (7,1) THEN 0 
WHEN dow1=dow2 THEN 1 
WHEN dow1 IN(7,1) AND dow2 NOT IN (7,1) THEN dow2-1 
WHEN dow1 NOT IN(7,1) AND dow2 IN(7,1) THEN 7-dow1 
WHEN dow1<=dow2 THEN dow2-dow1+1 
WHEN dow1>dow2 THEN 5-(dow1-dow2-1) 
ELSE 0 
END; 
RETURN days; 
END; 
| 
DELIMITER ; 

SELECT BizDaysInclusive('2009-8-1','2009-9-15'); 

select substr(o.order_date,1,10) a ,substr(o.created_date,1,10) b, CountWeekDays(substr(o.order_date,1,10),substr(o.created_date,1,10)) c from orders o WHERE o.order_date like '2010-04-08%' ; 
0

나는 기능에 대한없는 많은 일을하지만, 그것이 작동하는 경우 작동하지 않는 경우, 죄송보십시오.

select CountWeekDays(o.order_date,o.created_date) from orders o where o.id =1;