簡體   English   中英

周末返回MySQL函數

[英]MySQL function returning weekend days

我一直在嘗試獲取兩個給定日期之間的周末天數(星期六和星期日)。

我遇到了這個解決方案: http : //crossedlogic.blogspot.ca/2008/09/using-sql-to-find-work-days-in-date.html

當我調用該函數時,它在輸出中返回OK作為消息,我希望它返回周末的天數。

我究竟做錯了什么?

碼:

DROP FUNCTION IF EXISTS `fn_GET_WEEKEND_DAYS`;

DELIMITER $$
CREATE FUNCTION `fn_GET_WEEKEND_DAYS`(StartDate DATE, EndDate DATE) RETURNS INT
BEGIN
    # declare the variables.
    DECLARE varDays INT;

    # create the temprorary table to insert the data in.
    CREATE TEMPORARY TABLE temp(calendarDate DATE, isWeekend TINYINT(1));

    # insert the starting date.
    INSERT INTO temp VALUES(StartDate, NULL);

    # insert each day by increment of 1 day untill reached the end date.
    WHILE (SELECT MAX(CalendarDate) FROM temp) < EndDate DO
        INSERT INTO temp
        SELECT ADDDATE(MAX(CalendarDate), INTERVAL 1 DAY), NULL
        FROM temp;
    END WHILE;

    # update the is weekend field depending if the day of week of each row is 1 or 7. (saturday or sunday)
    UPDATE temp SET isWeekend = CASE WHEN DAYOFWEEK(calendarDate) IN (1, 7) THEN true ELSE false END;

    # count the date that are weekends.
    SELECT COUNT(calendarDate) INTO varDays FROM temp WHERE isWeekend = true;

    # drop the temp table.
    DROP TEMPORARY TABLE IF EXISTS temp;

    RETURN varDays;
END $$

測試:

SELECT fn_GET_WEEKEND_DAYS(CURDATE(), ADDDATE(CURDATE(), INTERVAL 10 DAY)) AS TEST;

任何幫助和建議,將不勝感激。

快速解決您當前的解決方案:-

DROP FUNCTION IF EXISTS `fn_GET_WEEKEND_DAYS`;

DELIMITER $$
CREATE FUNCTION `fn_GET_WEEKEND_DAYS`(StartDate DATE, EndDate DATE) RETURNS INT
BEGIN
    # declare the variables.
    DECLARE varDays INT;
    DECLARE varDate DATE;

    IF (StartDate > EndDate) THEN
        SET varDate = StartDate;
        SET StartDate = EndDate;
        SET EndDate = varDate;
    END IF;

    # create the temprorary table to insert the data in.
    CREATE TEMPORARY TABLE temp1(calendarDate DATE, isWeekend TINYINT(1));

    # insert the starting date.
    INSERT INTO temp1 VALUES(StartDate, NULL);

    # insert each day by increment of 1 day untill reached the end date.
    SET varDate = StartDate;
    WHILE varDate < EndDate DO
        INSERT INTO temp1 VALUES(ADDDATE(varDate, INTERVAL 1 DAY), NULL);
        SELECT MAX(CalendarDate) INTO varDate FROM temp1;
    END WHILE;

    # update the is weekend field depending if the day of week of each row is 0 or 1. (saturday or sunday)
    UPDATE temp1 SET isWeekend = CASE WHEN DAYOFWEEK(calendarDate) = 7 OR DAYOFWEEK(calendarDate) = 1 THEN true ELSE false END;

    # count the date that are weekends.
    SELECT COUNT(calendarDate) INTO varDays FROM temp1 WHERE isWeekend = true;

    # drop the temp1 table.
    DROP TEMPORARY TABLE IF EXISTS temp1;

    RETURN varDays;
END $$

最大的問題是它正在使用臨時表,並試圖根據無法從該臨時表中進行的選擇插入到臨時表中。 它將產生錯誤您不能在同一查詢中多次引用TEMPORARY表。 例如對於以下不起作用:

如果日期范圍有限,則可能很容易在單個SQL語句中完成

編輯

一種使用單個SQL語句進行復制的方法,最大復制日期范圍為9999天:-

SELECT SUM(IF(DAYOFWEEK(DATE_ADD('2014-05-02', INTERVAL units.aCnt + tens.aCnt * 10 + hundreds.aCnt * 100 + thousands.aCnt * 1000 DAY) ) IN (1,7), 1, 0))
FROM (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) units
CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) tens
CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) hundreds
CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) thousands
WHERE '2017-03-01' >= DATE_ADD('2014-05-02', INTERVAL units.aCnt + tens.aCnt * 10 + hundreds.aCnt * 100 + thousands.aCnt * 1000 DAY)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM