2012-02-09 10 views
3

私のデータベースに休日の束を保存したとしましょう。次の就業日を見つけるには

私がする必要があることは、土曜日とデータベースで定義されている祝日を除いて翌営業日です。

例えば、

今日は、2月15日の金曜日と17日と18日は、datetimeとしてデータベースに定義されている祝日です。だから、次の就業日を示すボタンを押すと、2月19日に戻るはずです。

これを取得する最も効率的な方法はどれですか?

+0

あなたは、このようなシナリオでは翌営業日見つけたい理由を私は理解していない...私はあなたが言うつもりされていないと信じてあなたの従業員はXYZがあなたの次の仕事日です...ちょうど尋ねる...理由がある場合は、共有していただけますか? –

+0

データベースのレイアウトに大きく依存します。ところで、この質問はjavaよりもSQLに関係しています。 – Marcelo

+0

C#を使用していますか? – ParPar

答えて

7

最も単純です。

ステップ1:1日追加するメソッドを作成します。List<String>

ステップ2でそれを保つ、あなたのフォーマットにDBから祝日と形式を取得します。

public static Date addDays(Date d, int days) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(d); 
    cal.add(Calendar.DATE, days); 
    return cal.getTime(); 
} 

ステップ3:休日を見つけるためのメソッドを作成します。

public boolean isBankHoliday(java.util.Date d) { 
    Calendar c = new GregorianCalendar(); 
    c.setTime(d); 
    if((Calendar.SATURDAY == c.get(c.DAY_OF_WEEK)) || (Calendar.SUNDAY == c.get(c.DAY_OF_WEEK)) || bankHolidays.contains(dString)) { 
     return (true); 
    } else { 
     return false; 
    } 
} 

手順4:入力日を取得します。銀行の休日を確認し、就業日を見つけるまでループしてください。

while (isBankHoliday(myDate)) { 
    myDate = addDays(myDate, 1); 
} 
+0

dStringはどこで宣言されていますか? – JustinKSU

+0

@vaanduは、次の作業を検索したいので、 'while(!isBankHoliday(myDate))'の代わりに '(while!isBankHoliday(myDate))'次の休日ではなく、日です。 – Springrbua

+1

@Springrbuaは指摘してくれてありがとう、訂正しました。 – Vaandu

0

私はあなたがこれを行うことができますJavaでの機能に組み込まれているかどうか知らないが、場合にはあなたがいない:

私の頭の上オフに -

最も簡単な、おそらくどの格納するだろう日は週末だけでなく祝日ですか? リファレンスポイント(2012年1月1日と言う)がある場合は、その曜日を保存して、新しい値を計算する際にmod 7算術を使用できますか?

3

あなたはこれを達成するためにDateCalculatorJoda(別売)を使用することができます。下の例では、休日はSetに格納され、moveByBusinessDaysメソッドが使用されています。

import java.util.HashSet; 

import junit.framework.Assert; 

import net.objectlab.kit.datecalc.common.DateCalculator; 
import net.objectlab.kit.datecalc.common.DefaultHolidayCalendar; 
import net.objectlab.kit.datecalc.common.HolidayHandlerType; 
import net.objectlab.kit.datecalc.joda.LocalDateKitCalculatorsFactory; 

import org.joda.time.LocalDate; 
import org.testng.annotations.BeforeSuite; 
import org.testng.annotations.Test; 

public class NextBusinessDayTest { 

    private DateCalculator<LocalDate> dateCalculator; 
    private final LocalDate startDate = new LocalDate(2012, 2, 9); // Thursday 


    @BeforeSuite 
    public void setUp() { 
     HashSet<LocalDate> holidays = new HashSet<LocalDate>(); 
     holidays.add(new LocalDate(2012, 2, 10)); // Friday 
     holidays.add(new LocalDate(2012, 2, 14)); // Tuesday 

     DefaultHolidayCalendar<LocalDate> holidayCalendar = new DefaultHolidayCalendar<LocalDate>(holidays); 

     LocalDateKitCalculatorsFactory.getDefaultInstance().registerHolidays("holidays", holidayCalendar); 
     dateCalculator = LocalDateKitCalculatorsFactory.getDefaultInstance().getDateCalculator("holidays", HolidayHandlerType.FORWARD); 
    } 


    @Test 
    public void testNextBusinessDay() { 
     dateCalculator.setStartDate(startDate); 
     Assert.assertEquals(dateCalculator.moveByBusinessDays(1).getCurrentBusinessDate(), 
     new LocalDate(2012, 2, 13)); // skips the 10th (holiday), 11th and 12th (weekend) 

     dateCalculator.setStartDate(startDate); 
     Assert.assertEquals(dateCalculator.moveByBusinessDays(2).getCurrentBusinessDate(), 
     new LocalDate(2012, 2, 15)); // also skips the 14th (holiday) 
    } 
} 

EDIT:

  1. ジョダを必要としない日付の計算ライブラリの代替バージョンがあります。
  2. ライブラリが他の機能を提供しているかどうかを確認してください。これはアプリケーションで役立ちます。次の作業日を見つけることが唯一のユースケースである場合は、自分でメソッドを記述する方が良い選択です。 Vanathiは基本的なアプローチを非常にうまく説明しました。
3

ただ、ミキサーに純粋なSQLソリューションをスローする:

DECLARE @InDate DATETIME 
SET @InDate = '25/12/2011' 

;WITH CTE ([Date]) AS 
( SELECT DATEADD(DAY, 1, CAST(@InDate AS DATE)) [Date] 
    UNION ALL 
    SELECT DATEADD(DAY, 1, [Date]) 
    FROM CTE 
    WHERE [Date] IN (SELECT [Date] FROM YourHolidayTable) 
    OR  DATENAME(WEEKDAY, [Date]) IN ('Saturday', 'Sunday') 
) 

SELECT MAX([Date]) [NextWorkingDay] 
FROM CTE 
関連する問題