2012-01-14 4 views
0

予定表と予定表とを比較したいので、翌週のすべての時間を表示するにはどうすればよいでしょうか。次の月にすべての時間を表示するMySQLクエリ

ありがとうございました!期待される結果は5

から9の間のように素晴らしいことだ

edit--

| client_date | client_time |
2010年10月1日9時00分00秒
2010年10月1日午前10時00分00秒
2010年10月1日11時00分00秒
2010年10月1日午前12時00分○○秒
2010年10月1日午前13時00分〇​​〇秒
2010年10月1日夜2時00分00秒
2010年10月1日15時〇〇分00秒
2010年10月1日午後四時00分00秒
10/01/2010 17:00:00

+1

質問は不明です。作成する出力の例を追加してください。 – Paker

+0

更新済み申し訳ありません、返信ありがとうございます –

+0

「タイムテーブルをこれと比較してください」とはどういう意味ですか? SQLはクエリの日付/時刻操作をサポートしているので、うまくいけばそれを複製していません。 –

答えて

1

ストアドプロシージャ内のテンポラリテーブルを使用できます。

DELIMITER ;; 
DROP PROCEDURE IF EXISTS ListHours ;; 
CREATE PROCEDURE ListHours() 
BEGIN 
DECLARE curDT DATETIME; 
DECLARE today DATETIME ; 
DECLARE nextSaturday DATETIME; 
DECLARE nextSunday DATETIME; 
DECLARE iterDate DATETIME; 
DECLARE iterDateTime DATETIME; 
DECLARE iterBound DATETIME; 
DECLARE resDate DATETIME; 
DECLARE resTime DATETIME; 
DECLARE delta INT; 
DROP TABLE IF EXISTS tempNextWeek; 
CREATE TEMPORARY TABLE IF NOT EXISTS tempNextWeek 
(
    client_date VARCHAR(20), 
    client_time VARCHAR(20) 
); 
DELETE FROM tempNextWeek; 
SET curDT = NOW(); 
SET today = ADDTIME(SUBTIME(curDT , TIME(curDT)) , '9:0:0'); 
SET delta = 8 - DAYOFWEEK(today); 
SET nextSunday = ADDDATE(today , INTERVAL delta DAY); 
SET nextSaturday = ADDTIME(nextSunday , '6 0:0:0'); 
-- select today , delta , nextSaturday , nextSunday ; 
SET iterDate = nextSunday; 
WHILE iterDate <= nextSaturday DO 
    SET iterDateTime = iterDate; 
    SET iterBound = ADDTIME(iterDateTime, '8:0:0'); 
    WHILE iterDateTIme <= iterBound DO 
     INSERT tempNextWeek (client_date, client_time) VALUE (DATE_FORMAT(iterDateTime, '%Y-%m-%d'), DATE_FORMAT(iterDateTime, '%H:%i:%s')); 
     SET iterDateTime = ADDTIME(iterDateTime , '1:0:0'); 
    END WHILE; 
    SET iterDate = ADDTIME(iterDate , '1 0:0:0'); 
END WHILE ; 
SELECT * FROM tempNextWeek; 
-- drop table if exists tempNextWeek; 
END;; 
DELIMITER ; 

CALL ListHours(); 
+0

バグ修正が掲載されています。 –

1

日付と時刻の値を格納するテーブルを作成する必要があります。

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番目のステートメントはテーブルからレコードを返します。

関連する問題