16

私のテーブルにはサンプル データがあり、2 つの列の 2 つのタイムスタンプ間の営業時間を計算する必要があります。営業時間:9:00~17:00 土日はお休み、祝日は考慮しておりません。誰かがこれを達成する方法についていくつかのガイドラインを提供できますか? 列 3 に記載されている出力が必要です。日付の形式は yyyy-mm-dd です。

    Created date             Updated date         Business hrs
    2012-03-05 9:00am   2012-03-05 3:00pm             6
    2012-03-05 10:00am  2012-03-06 10:00am            9
    2012-03-09 4:00pm   2012-03-19 10:00am            2
4

4 に答える 4

4

BusinessHoursというテーブルを作成し、Hourという1つの列に日時を含めます。Hourを主キーにします。2012-01-02 00:90:00, 2012-01-02 00:10:001年のすべての営業時間(など)を入力するプロセスを記述します。ルールは単純なので、これは難しいことではありません。大量のデータのように聞こえますが、大規模なスキームではそうではありません(1年に8760時間しかないので、日付時刻がそれぞれ8バイトであっても、これはなんと60kBです)。必ずジョブをスケジュールして、データが入力された状態に保たれるようにしてください。

それで:

Select
  y.CreatedDate,
  y.UpdatedDate,
  Count(*) as BusinessHours
From
  YourTable y
    Inner Join
  BusinessHours h
    On h.Hour >= y.CreatedDate And h.Hour < y.UpdatedDate
Group By
  y.CreatedDate,
  y.UpdatedDate

これにより、祝日を検討する場合は、かなり簡単なアプローチが可能になります。BusinessHoursテーブルから行を削除するだけです。

于 2012-11-17T00:13:32.920 に答える
1

datediff を使用して、開始時刻と終了時刻の差を計算し、(date_add と負の時間を指定して) 非稼働時間を減算します。週末の場合は 24、稼働日の場合は 16 で、追加の計算が必要な終了日と開始日が予想されます。土日かどうかはdayofweekメソッドで指定できます。

于 2015-10-20T15:45:54.317 に答える
0

試す

SELECT (FLOOR(DATEDIFF (UpdatedDate, CreatedDate) / 7) * 5 + MOD (DATEDIFF (UpdatedDate, CreatedDate), 7)) * 8 +
       TIMEDIFF (TIME (UpdatedDate), TIME(CreatedDate))
FROM YourTable

上記は週末を「推定」するだけなので完全ではありません...しかし、それはあなたを始めるはずです...別のオプションは、有効な営業時間の表を操作することです(詳細については、ローレンスからのこの回答を参照してください)。

参照については、MySQL のドキュメントを参照してください。

于 2012-11-17T00:17:15.157 に答える