注:方法体中涉及的表和function方体体都不是重点。
先贴出在数据中能执行的sql代码:
DELIMITER $$
DROP FUNCTION IF EXISTS `f_continuty_days`$$
CREATE
FUNCTION f_continuty_days(id INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE days INT;
DECLARE flag INT;
DECLARE previous_day DATE;
SET days = 0;
SET flag = 1;
SET previous_day = DATE_SUB(CURDATE(),INTERVAL 1 DAY);
WHILE flag>0 DO
SELECT COUNT(DISTINCT(DATE(soidv.USE_DATE))) INTO flag FROM driver_in di LEFT JOIN SI si ON di.ID=si.DRIVER_IN_ID
WHERE di.ID=id
AND si.STATUS <> 9
AND DATE(si.USE_DATE) = previous_day ;
IF flag > 0 THEN
SET days = days + 1;
SET previous_day = DATE_SUB(previous_day,INTERVAL 1 DAY);
END IF;
END WHILE;
RETURN days;
END$$
这段sql复制到java执行却不行,然后将这段代码分成两部分 分别执行就可以。
第一部分:
DROP FUNCTION IF EXISTS `f_continuty_days`
第二部分:
CREATE
FUNCTION f_continuty_days(id INT)
RETURNS INTDETERMINISTIC
READS SQL DATA
BEGIN
DECLARE days INT;
DECLARE flag INT;
DECLARE previous_day DATE;
SET days = 0;
SET flag = 1;
SET previous_day = DATE_SUB(CURDATE(),INTERVAL 1 DAY);
WHILE flag>0 DO
SELECT COUNT(DISTINCT(DATE(soidv.USE_DATE))) INTO flag FROM driver_in di LEFT JOIN SI si ON di.ID=si.DRIVER_IN_ID
WHERE di.ID=id
AND si.STATUS <> 9
AND DATE(si.USE_DATE) = previous_day ;
IF flag > 0 THEN
SET days = days + 1;
SET previous_day = DATE_SUB(previous_day,INTERVAL 1 DAY);
END IF;
END WHILE;
RETURN days;
END
(其中
DETERMINISTIC
READS SQL DATA 作用:如果数据库开启了bin-log,申明函数中sql只读数据不做修改)
虽然解决了,但是原因不明,可能会对其他东西有影响,谨慎使用。这里的方法可能也不是最好的解决方法。。。