完全な中間日付の時差を計算するための比較的簡単なソリューションを思いつきました。ただし、開始日と終了日の時差を計算するために mysql を使用するのは少し面倒です。私はそれらをソリューションに含めましたが、いくつかの仮定があります。
いずれにせよ、ここにSQLがあります
SET @startdate:='2012-12-24 17:00:00';
SET @enddate:='2013-01-02 12:00:00';
SELECT
TIME_TO_SEC(TIMEDIFF(CONCAT(DATE(@startdate),' 17:30:00'), @startdate))/3600 as startday_time,
TIME_TO_SEC(TIMEDIFF(@enddate, CONCAT(DATE(@enddate),' 9:00:00')))/3600 as endday_time,
SUM(daily_hours) as otherdays_time from
(
SELECT 7.5 as daily_hours, id, DATE_ADD(DATE(@startdate),INTERVAL id-1 DAY) as idate from numbers
) dates
LEFT JOIN holidays on DATE(dates.idate) = DATE(holidays.date)
WHERE
idate BETWEEN @startdate AND @enddate
AND holidays.date IS NULL
AND DAYOFWEEK(idate) <> 7 AND DAYOFWEEK(idate) <> 1;
ここのsqlfiddle:
http://sqlfiddle.com/#!2/ff3f3/1/2
有効な中間日付を取得するには、2 つのテーブルが必要です。1 つはholidays
すべての休日の日付をリストするnumbers
テーブル、もう 1 つは一連の整数を含むテーブルで、結合して連続した一連の日付を取得するのに非常に便利です (ギャップなし)。
注: sqlfiddle では、このnumbers
例で使用されている日付をカバーするために、最大 12 個のテーブルにデータを入力しました。作業する日付の範囲によっては、より多くの数値を入力する必要があるでしょう。
開始時刻と終了時刻については、次の仮定を行いました。
- 開始日と終了日は両方とも有効な日付であり、合計時間にカウントする必要があります
- 開始日の時間が昼食から 17 時 30 分までであること
- 終了日の時間が昼食から 17 時 30 分までであること
これらの仮定が間違っている場合は、深刻な条件付きの領域 (多くの if を含む) に陥っているため、これを php (または何でも) で実行するのが最適な場合があります。
注: 説明のために時間 (時間単位) を追加せずに残しました。