1

次のことを考慮して、2 つの日付の時差を計算するにはどうすればよいですか。

  • 月曜日から金曜日のみ
  • 午前 9 時から午後 5 時 30 分までの時間。
  • 休日を除外します。

例:

  • d1 = 2012-10-05 17:00:00
  • d2 = 2012-14-09 12:00:00

計算手順:

  • 2012-10-05 = 00:30:00
  • 2012-10-06 = 00:00:00
  • 2012-10-07 = 00:00:00
  • 2012-10-08 = 07:30:00
  • 2012-10-09 = 04:00:00

ddiff(d2,d1) = 12:00:00

here で説明されているように、mon-fri のみを使用してそれを行う方法を知っています。そして、私はMySQLについて話しています。

4

1 に答える 1

2

完全な中間日付の時差を計算するための比較的簡単なソリューションを思いつきました。ただし、開始日と終了日の時差を計算するために 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 (または何でも) で実行するのが最適な場合があります。

注: 説明のために時間 (時間単位) を追加せずに残しました。

于 2012-10-16T16:00:59.373 に答える