2010-04-06 40 views
1

我刚写了一个存储函数来计算两个日期之间的工作日。 这工作mysql存储函数的用法

选择 CountWeekDays( '2010-03-07', '2010-04-07')

这不起作用

选择 CountWeekDays( o.order_date,o.created_date) from orders o;

任何想法如何使这项工作的一个?

函数定义

定界符$$;

CREATE FUNCTION CountWeekDays(SDATE VARCHAR(50),EDATE VARCHAR(50)) 返回int

BEGIN

DECLARE wdays,TDIFF,计数器,THISDAY SMALLINT;

DECLARE newdate DATE;

SET newdate:= SDATE;

SET wdays = 0;

如果DATEDIFF(EDATE,SDATE)= 0 THEN RETURN 1;万一;

if DATEDIFF(edate,sdate)< 0 THEN RETURN 0;万一;

label1的:LOOP

SET THISDAY = DAYOFWEEK(newdate);

IF THISDAY 2到6之间再设置 wdays:= wdays + 1;万一;

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

IF DATEDIFF(edate,newdate)< 0 THEN LEAVE label1;万一;

END LOOP label1;

RETURN wdays;

END

+0

o.order_date和o.created_date的列类型是什么? – Andy 2010-04-06 11:26:14

+0

@它的日期时间 – shikhar 2010-04-06 11:36:41

回答

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;