2016-07-22 8 views
0

提供日に5日を追加したいが、計算は週末をスキップする必要があります。MYSQL現在の勤務日を追加する

私はすでに週末をスキップせずに5日間を追加する方法を知っている:

SELECT DATE_ADD(`date_field`, INTERVAL 5 DAY) As FinalDate 
FROM `table_name`; 

今、私は週末をスキップする返された値を求めています。

現在

date_field = 2016-07-22結果は2016-07-27
になります。しかし、私は結果がこれを試してみてください2016-07-29

+0

http://stackoverflow.com/questions/5471524/add-business-days-to-date-in-sql-without-loopsをご覧ください。あなた自身で解決策を試すのに役立ちます。 – cnayak

+0

5日間の追加のみを予定している場合:5営業日は1週間ですので、いつも7を追加することはありませんか? – Sam

+0

はい、回答は柔軟です –

答えて

1

になりたい場合は:それは、します

まず
  • SELECT DATE_ADD(
        date_field, 
        INTERVAL 5 + 
        IF(
         (WEEK(date_field) <> WEEK(DATE_ADD(date_field, INTERVAL 5 DAY))) 
         OR (WEEKDAY(DATE_ADD(date_field, INTERVAL 5 DAY)) IN (5, 6)), 
         2, 
         0) 
        DAY 
        ) AS FinalDate 
    FROM `table_name`; 
    

    どのように動作しますあなたの日に5日間を追加してください。

  • 第2に、date_fieldと5日後の2週間が異なる場合は、さらに2日間追加する必要があります。
  • 第3に、5日後がSatまたはSunの場合、さらに2日間追加する必要があります。
0

私はあなたのソリューションを試してみましたが、より大きな間隔(例えば20日)とそれを使用するときに問題に直面しました。それは少し間隔で完全に動作します。

例: '2017-10-04' + 20日間、アルゴリズムは '2017-10-26'を返します。 4つの週末をスキップするので、 '2017-11-01'にする必要があります。

あなたが追加する日数は2週間の違いに応じて計算されませんので、あなたが追加できる最大日数は2日ですが、私の場合は8(4x2)でなければなりません。

私は私の週番号ができ得る方法が変なようだが、私は実行しているためである。この(私も変数を追加し、はるかに便利修正するために)

SELECT 
@ID:='2017-10-04' as initial_date, -- the initial date in the right format to manipulate (add x day) 
@DTA:=20 as days_to_add, -- number of days to add 
@DA:= DATE_ADD(@ID, INTERVAL @DTA DAY) as date_add, 
@LASTDAY := WEEKDAY(@DA) as last_day, -- the day (Monday, Tuesday...) corresponding to the initial date + number of days to add 
@WEEK1 := DATE_FORMAT(@ID, '%v') as initial_date_week, -- format the initial date to match week mode 3 (Monday 1-53) 
@WEEK2 := DATE_FORMAT(@DA, '%v') as added_date_week_nbr, -- the week # of the initial_date + number of days to add 
@WEEKDIFF := @WEEK2 - @WEEK1 as week_difference, -- the difference between week 2 and week 1 
DATE_ADD(@ID, 
     INTERVAL @DTA + 
      if (@WEEKDIFF > 0 or @LASTDAY in (5,6), 
       2, 
       0 
      ) + 
      if (@WEEKDIFF > 1, 
      @WEEKDIFF*2, 
      0 
      ) DAY 
    ) AS FinalDate 

で終わるようにコードを修正これは、フランスと私のDBは、週がネイティブに日曜日に開始されるように構成されているようです。「%v」は、数週間の「モード3」を表します。詳細は、MySQLのドキュメントを参照してください。https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html(ctrl + F > '%v')

私はまだ祝日を実装していませんでしたが、私は毎日の計算でX日を追加することを考えています。私たちが見ている期間に

私の(いくつかの)テストによると、これはうまくいくはずです。

関連する問題