日付と時刻の値を格納するテーブルを作成する必要があります。
CREATE TABLE calendarhours (caldaytime DATETIME);
次に、2つの日付をループし、タイムシート時間の日付時間値をテーブルに挿入するストアドプロシージャを作成する必要があります。
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `timesheetdays`(startdate DATETIME, enddate DATETIME)
BEGIN
DECLARE tempdate DATETIME;
DELETE FROM `calendarhours`;
-- set the temp date to 9am of the start date
SET tempdate = DATE_ADD(DATE(startdate), INTERVAL '0 9' DAY_HOUR);
-- while the temp date is less than or equal to the end date, insert the date
-- into the temp table
WHILE (tempdate <= enddate) DO
BEGIN
-- insert temp date into temp table
INSERT INTO `calendarhours` (caldaytime) VALUES (tempdate);
-- increment temp date by an hour
SET tempdate = DATE_ADD(tempdate, INTERVAL '0 1' DAY_HOUR);
-- if the temp date is greater than 5 PM (17:00) then increment to the next day
IF TIMEDIFF(tempdate, DATE_ADD(DATE(tempdate), INTERVAL '0 17' DAY_HOUR)) > 0 THEN
BEGIN
-- increment to the next day
SET tempdate = DATE_ADD(DATE(tempdate), INTERVAL '1 9' DAY_HOUR);
-- for business purposes, if the day is a Saturday or a Sunday increment
-- until we reach Monday
WHILE (DAYNAME(tempdate) = 'Saturday' OR DAYNAME(tempdate) = 'Sunday') DO
BEGIN
SET tempdate = DATE_ADD(DATE(tempdate), INTERVAL '1 9' DAY_HOUR);
END;
END WHILE;
END;
END IF;
END;
END WHILE;
-- return all the inserted date and times
SELECT * FROM calendarhours ORDER BY caldaytime;
END
この手順は、2つの日付をループは、毎日午前9時から開始し、午後5時毎日(17:00)仕上げます。時間が18:00になると、手順は翌日に増分され、午前9時に再び開始されます。
標準の営業週のタイムシートを実行している場合、その日が土曜日または日曜日と等しい場合は、月曜日になるまで増分します。
CALL `timesheetdays`(NOW(), DATE_ADD(DATE(NOW()), INTERVAL '5 0' DAY_HOUR));
SELECT * FROM `calendarhours`;
これは今日から5日まで、今日から手順をテストし、必要に応じて時間を示しています
はこれをテストするために、私は次の文を使用していました。最初のステートメントはレコードをテーブルに追加してレコードを返し、2番目のステートメントはテーブルからレコードを返します。
質問は不明です。作成する出力の例を追加してください。 – Paker
更新済み申し訳ありません、返信ありがとうございます –
「タイムテーブルをこれと比較してください」とはどういう意味ですか? SQLはクエリの日付/時刻操作をサポートしているので、うまくいけばそれを複製していません。 –