3

稼働日数 (月曜日から金曜日) と開始 DATE または DATETIME (実装には関係ありません) を渡して、稼働日数分の新しい DATE または DATETIME を返すことができる MySQL 関数が必要です。将来。

例: SELECT AddWorkDays(10, "2013-09-01")「2013-09-01」が月曜日であると仮定して、「2013-09-16」を返します。

同様に、 SELECT AddWorkDays(-10, "2013-09-16")「2013-09-01」を返します

MySQL にないことを除けば、まさに私が必要としている MSSQL データベース (私が思うに) 用のこの関数を見つけました。私はそれを手動で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 ;

エラーが発生します:

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
4

8 に答える 8

10

これは、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 ;
于 2013-07-18T18:50:26.360 に答える
1
-- This is exact query which adds no of business days to date (Exclude Saturday and Sunday)   
 DROP FUNCTION IF EXISTS DateAddBusiness;
    DELIMITER ||
    CREATE FUNCTION DateAddBusiness(mydate DATE, numday INT) 
    RETURNS DATE
    DETERMINISTIC
    COMMENT 'Adds business days between two dates'
    BEGIN
     DECLARE num_week INT DEFAULT 0;
     DECLARE num_day INT DEFAULT 0;
     DECLARE adj INT DEFAULT 0;
     DECLARE total INT DEFAULT 0;
     SET num_week = numday DIV 5;
     SET num_day = MOD(numday, 5);

     IF (DAYOFWEEK(mydate)=6 || DAYOFWEEK(mydate)=5 || DAYOFWEEK(mydate)=4 ) then
      SET adj = 2;
     END IF;

     IF (DAYOFWEEK(mydate)=7 ) then
      SET adj = 1;
     END IF;

     SET total = adj + num_day;
     RETURN DATE_ADD(mydate, INTERVAL total DAY);
    END
    ||
    DELIMITER ;


    -- Unit testing queries
    select DateAddBusiness("2015-10-19","3") // 22
    select DateAddBusiness("2015-10-20","3") // 23

    select DateAddBusiness("2015-10-21","3") // 26
    select DateAddBusiness("2015-10-22","3") // 27
    select DateAddBusiness("2015-10-23","3") // 28
    select DateAddBusiness("2015-10-24","3") //28
    select DateAddBusiness("2015-10-25","3") //28
    select DateAddBusiness("2015-10-26","3") //29
于 2015-10-26T05:37:10.140 に答える
1

ここに示すバージョンを変更して、正と負の両方の日を受け入れるようにしました。他の答えはどれも私のためにそれをしていなかったので、これが私が思いついた最も効率的な解決策です.

DROP FUNCTION IF EXISTS WORKDAY_ADD;
DELIMITER &&
CREATE FUNCTION WORKDAY_ADD(mydate DATE, numday INT) RETURNS DATE
BEGIN
DECLARE num_week INT DEFAULT 0;
DECLARE num_day INT DEFAULT 0;
DECLARE adj INT DEFAULT 0;
DECLARE total INT DEFAULT 0;
SET num_week = ABS(numday DIV 5);
SET num_day = MOD(numday, 5);

IF (WEEKDAY(DATE_ADD(mydate, INTERVAL num_day DAY)) >= 5) THEN 
    SET adj = 2;
END IF;

SET total = (num_week * 7 + adj + ABS(num_day));

IF numday < 0 THEN
    SET total = total * -1;
END IF;

RETURN DATE_ADD(mydate, INTERVAL total DAY); 
    
END&&
DELIMITER ;

使用法

5 営業日を加算: SELECT WORKDAY_ADD('2016-02-18', 5)
2 営業日を減算:SELECT WORKDAY_ADD('2016-02-18', -2)

于 2016-02-18T17:13:07.753 に答える
0

この投稿には、あなたが求めるものを作った機能があります。その機能はあなたを助けることができると思います。

于 2013-07-18T19:33:13.837 に答える