私のデータベースに休日の束を保存したとしましょう。次の就業日を見つけるには
私がする必要があることは、土曜日とデータベースで定義されている祝日を除いて翌営業日です。
例えば、
今日は、2月15日の金曜日と17日と18日は、datetimeとしてデータベースに定義されている祝日です。だから、次の就業日を示すボタンを押すと、2月19日に戻るはずです。
これを取得する最も効率的な方法はどれですか?
私のデータベースに休日の束を保存したとしましょう。次の就業日を見つけるには
私がする必要があることは、土曜日とデータベースで定義されている祝日を除いて翌営業日です。
例えば、
今日は、2月15日の金曜日と17日と18日は、datetimeとしてデータベースに定義されている祝日です。だから、次の就業日を示すボタンを押すと、2月19日に戻るはずです。
これを取得する最も効率的な方法はどれですか?
最も単純です。
ステップ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);
}
dStringはどこで宣言されていますか? – JustinKSU
@vaanduは、次の作業を検索したいので、 'while(!isBankHoliday(myDate))'の代わりに '(while!isBankHoliday(myDate))'次の休日ではなく、日です。 – Springrbua
@Springrbuaは指摘してくれてありがとう、訂正しました。 – Vaandu
私はあなたがこれを行うことができますJavaでの機能に組み込まれているかどうか知らないが、場合にはあなたがいない:
私の頭の上オフに -
最も簡単な、おそらくどの格納するだろう日は週末だけでなく祝日ですか? リファレンスポイント(2012年1月1日と言う)がある場合は、その曜日を保存して、新しい値を計算する際にmod 7算術を使用できますか?
あなたはこれを達成するためにDateCalculatorとJoda(別売)を使用することができます。下の例では、休日は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:
ただ、ミキサーに純粋な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
あなたは、このようなシナリオでは翌営業日見つけたい理由を私は理解していない...私はあなたが言うつもりされていないと信じてあなたの従業員はXYZがあなたの次の仕事日です...ちょうど尋ねる...理由がある場合は、共有していただけますか? –
データベースのレイアウトに大きく依存します。ところで、この質問はjavaよりもSQLに関係しています。 – Marcelo
C#を使用していますか? – ParPar