2010-04-06 37 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;