MySQL函数向DATETIME添加一些工作日

Jas*_*tol 1 mysql sql sql-function

我需要一个MySQL函数,它允许我通过一些工作日(星期一到星期五)和开始DATE或DATETIME(对我的实现无关紧要),并让它返回一个新的DATE或DATETIME,许多工作日在将来.

示例:SELECT AddWorkDays(10, "2013-09-01")返回"2013-09-16",假设"2013-09-01"是星期一.

同样:SELECT AddWorkDays(-10, "2013-09-16")返回"2013-09-01"

我发现这个函数用于MSSQL数据库(我认为)正是我需要的,除了它不在MySQL中.我尝试手动将其转换为MySQL语法并实现了这一点:

DROP FUNCTION IF EXISTS AddWorkDays;
DELIMITER $$
CREATE FUNCTION AddWorkDays
(
    WorkingDays INT,
    StartDate DATE
)
RETURNS DATE

BEGIN
    DECLARE Count INT;
    DECLARE i INT;
    DECLARE NewDate DATE;
    SET Count = 0;
    SET i = 0;

    WHILE (i < WorkingDays) DO
        BEGIN
            SET Count = Count + 1;
            SET i = i + 1;
            WHILE DAYOFWEEK(ADDDATE(StartDate, Count)) IN (1,7) DO
                BEGIN
                    SET Count = Count + 1;
                END;
            END WHILE;
        END;
    END WHILE;

    SET NewDate = ADDDATE(StartDate, Count);
    RETURN NewDate;

END;
$$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

我最终得到一个错误:

Error 1415: Not allowed to return a result set from a function

我似乎无法弄清楚它究竟在何处返回结果集.

我的语法有错误吗?还有更好的解决方案吗?

谢谢!

编辑

看起来MySQL没有DATEPART或DATEADD功能.我在文档中看到他们有ADDDATE和DAYOFWEEK.更新了代码以代表此代码.我还将SELECT语句更改为SET(现在理解为什么我得到原始错误)

因此,当尝试使用CF函数运行查询时,我收到一个新错误

[Table (rows 1 columns ADDWORKDAYS(10,"2013-09-01")): [ADDWORKDAYS(10,"2013-09-01"): coldfusion.sql.QueryColumn@7a010] ] is not indexable by ADDWORKDAYS(10
Run Code Online (Sandbox Code Playgroud)

Gio*_*ino 7

这是mysql语法的新功能:

DROP FUNCTION IF EXISTS AddWorkDays;
DELIMITER $$
CREATE FUNCTION AddWorkDays
(
    WorkingDays INT,
    StartDate DATETIME
)
RETURNS DATETIME

BEGIN
    DECLARE Count INT;
    DECLARE i INT;
    DECLARE NewDate DATETIME;
    SET Count = 0;
    SET i = 0;

    WHILE (i < WorkingDays) DO
        BEGIN
            SELECT Count + 1 INTO Count;
            SELECT i + 1 INTO i;
            WHILE DAYOFWEEK(DATE_ADD(StartDate,INTERVAL Count DAY)) IN (1,7) DO
                BEGIN
                    SELECT Count + 1 INTO Count;
                END;
            END WHILE;
        END;
    END WHILE;

    SELECT DATE_ADD(StartDate,INTERVAL Count DAY) INTO NewDate;
    RETURN NewDate;

END;
$$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)