2012-02-09 33 views
3

假設我已經在我的數據庫中存儲了一堆假期。找到下一個工作日

我需要做的是找出哪些是下一個工作日,不包括星期六和數據庫中定義的公共假期。

例如。

假設今天是2月15日星期五,17日和18日是公共假期,如數據庫中定義的日期時間。所以現在當我按下一個表示下一個工作日的按鈕時,它應該會在2月19日返回。

哪種方法最有效?

+0

爲什麼你要找到下一個工作日在這種情況下,我不明白...我相信你不會告訴你的員工XYZ是你下一個工作日......只是問......如果有理由,請分享一下嗎? – 2012-02-09 09:28:40

+0

嚴重依賴於您的數據庫佈局。順便說一句,這個問題更多的是與SQL相比,我會說。 – Marcelo 2012-02-09 09:29:08

+0

你使用C#嗎? – ParPar 2012-02-09 09:30:11

回答

7

最簡單。

第1步:從DB節假日和格式,以您的格式,將其存放在List<String>

第2步:創建,增加了一天的方法。

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 2014-09-29 16:24:01

+0

@vaandu不應該第4步是while(isBankHoliday(myDate))'而不是'while(!isBankHoliday(myDate))'(「!」不應該在那裏),因爲你想找到下一個工作第二天,不是下一個假期。 – Springrbua 2014-11-25 09:49:59

+1

@Springrbua感謝您指出,糾正它。 – Vaandu 2014-11-25 20:44:59

0

我不知道你是否已經建立在J​​ava的功能,可以做到這一點,但如果你不這樣做:

關閉我的頭頂 -

最簡單的將可能是存儲哪個日子是週末還是公共假期? 或者如果你有一個參考點(比如說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) 
    } 
} 

編輯:

  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 
相關問題