2009-10-22 10 views
3

현재 시작일 (DateTime) 및 기간 (일)을 기준으로 종료일을 계산하지만 계산에 주말이나 공휴일은 고려하지 않습니다. .날짜 계산에서 주말 및 맞춤 요일 (예 : 공휴일) 제외

내 솔루션이 올바르지 않습니다. 이것은 단지 출발점이었습니다.

나는 몇 가지 기사를 읽었으며 한 가지 접근법은 앞으로 50 년 동안 모든 주말과 공휴일을 가진 거대한 달력 테이블을 만드는 것입니다. 내 생각에 달력 테이블에 대해 날짜 범위를 쿼리하고 주말 및/또는 공휴일 수를 뺍니다.

문제는 내가 작업하고있는 소프트웨어가 사용자가 자신의 프로젝트 달력을 설정할 수 있도록한다는 것입니다. 소프트웨어로 사용자가 여러 프로젝트를 관리 할 수 ​​있다는 점을 감안할 때 테이블이 커지려고하지 않습니까?

그래서 내 질문에 어떻게 시작해야할까요? 그리고이 문제에 대한 접근 방법은 무엇입니까?

기본적으로 프로젝트 작업마다 START 날짜와 DURATION이 주어진 작업 완료 날짜를 계산해야하지만 주말과 맞춤 날짜 (일명 공휴일)는 고려해야합니다.

아이디어가 있으십니까?

은 BTW : 나는 [오랜 기간]의 나머지 부분에 대한 모든 주말과 휴일을 포함하는 큰 달력을 만들기 SQL 서버 2005

+1

RDBMS를 제외한 후 다음 wrking 날짜를 얻을하는 데 도움이? (SQL Server? Oracle?) – SLaks

+0

50 일? 그건 오타일까요? 대부분의 달력 표에는 수년간 데이터가 있어야합니다. –

+0

일에서 수요일까지 편집 됨 –

답변

1

나는 몇 가지 기사를 읽었으며 한 가지 접근법은 앞으로 50 년 동안 모든 주말과 공휴일을 가진 거대한 달력 테이블을 만드는 것입니다. 내 생각에 달력 테이블에 대해 날짜 범위를 쿼리하고 주말 및/또는 공휴일 수를 뺍니다.

일부 휴일은 일관되게 동일한 날짜에 속하지 않기 때문입니다. 예를 들어 노동절 - 9 월 첫 번째 월요일. 더 쉽게 &은 db를 계산하는 규칙을 코딩하려고 시도하는 것보다 연간 기준으로 떨어지는 날짜를 저장하기 위해 db의 공간을 덜 차지합니다.

기타주의 사항은 토요일/일요일에 휴일 인 휴일입니다. 월요일이나 금요일에 쉬는 날은 토스 풀입니다. 그리고 일부 휴일은 연방 정부가 될 것이며 다른 지역은 지방 정부입니다.

+0

D' oh ...이 답변이 접수 될 때까지 내 답변을받지 못했습니다. –

+0

부활절은 너무 나쁘지 않습니다. 왜냐하면 당신은 그 공식을 찾을 수 있기 때문입니다. 더 큰 문제는 2002 년 Jubliee를 위해 영국이 추가 공휴일을 가졌거나 2000 년 시드니 올림픽이 시작될 때 호주가 추가 공휴일을 갖는 것과 같이 여분의 일이 쏟아져 나오는 경우입니다. 휴일을 나열하는 테이블 또는 달력 테이블에 "IsHoliday"필드가 있습니다. –

+0

라마단 (Ramadan)과 같은 것들을 고려해보십시오. 라마단은 해마다 그리고 장소에 따라 다릅니다. 그것은 또한 법령의 날짜가 계산에 의해 추정 될 수 있지만, * caclulated 아니 * * 결정이야. http://j.mp/GKzaM –

1

을 사용하고, 그것은 단지 선택 설정했습니다. 그런 다음 새 프로젝트가 생성 될 때마다 달력에 필요한 일을 달력에 복사하십시오.

0

theDay 및 IsPublicHoliday라는 열이있는 AllDays라는 테이블이 있다고 가정합니다. 또한 @@ DATEFIRST를 1로 설정하여 주말이 1 일과 7 일이되도록하십시오. @StartDate에서 @n 일인 날짜를 찾고 싶습니다.

WITH NumberedDays AS 
(
SELECT theDay, ROW_NUMBER() OVER (ORDER BY theDay) AS DayNum 
FROM AllDays 
WHERE DATEPART(dw, theDay) NOT IN (1,7) 
AND IsPublicHoliday = 0 
AND theDay > @StartDate 
) 
SELECT theDay 
FROM NumberedDays 
WHERE DayNum = @n 
; 

당신이 AllDays라는 테이블이없는 경우에, 당신은 쉽게 theDay이 DATEADD 인 숫자의 테이블을 사용할 수 있습니다 (일, NUM, @ STARTDATE). 당신은 부적격 일 목록에 LEFT JOIN을 할 수 있습니다 (물론 인덱스되어야합니다).

0

@ 스튜어트 : 예, 50 일은 유형 = P입니다. 나는 50 년을 의미했다.

@rexem : 사실입니다. 계산이 너무 복잡하고 오류가 발생하기 쉽습니다.

@David : 선택 전용 마스터 캘린더 테이블을 만든 다음 프로젝트 당 필요한 날짜를 복사하는 것이 좋습니다.

(용서, 내 트위터 같은 응답, 하하) 큰 응답

감사합니다!

+0

의견을 남길 수 있도록 담당자가 필요합니다. p –

+0

사과드립니다. 나는 지금 코멘트 버튼을 보았다. 나는 그 구별을 완전히 알지 못했다. 감사! – Abe

0

안녕하세요이 산사 나무의 열매 나는 그것을 해결된다

먼저 내가 가진 달력 테이블 (tb_cal)를 만든 두 개의 필드 date_day (smalldate), 휴일 다음 (비트)

CREATE TABLE [user].[tb_cal](
[date_day] [smalldatetime] NULL, 
[holiday] [bit] NULL 
) ON [PRIMARY] 

이 기능 :

CREATE FUNCTION [user].[fc_get_labor_days] 
(@from datetime, @to datetime) 
RETURNS int 
AS 
BEGIN 
return ( 
select count(*) as total 
from tb_cal 
where datepart(dw, date_day) not in (1,7) 
and holiday <> 1 
and date_day > @from and date_day <= @to) 
END 
당신이 매개 변수를 전달하여이 함수를 호출 할 수

(에서,에)

,210

희망이 코드 아래

0

사용이 주말과 휴일

Declare @AddDay as integer = 3 
Declare @NextWorkingDate DateTime 
Declare @StartDate DateTime = Cast(getdate() as date) 

While @AddDay > 0 
    begin 

     Select @NextWorkingDate = @StartDate + @AddDay + 
     (datediff(wk, @StartDate, @StartDate+ @AddDay ) * 2) -- add weekend 

     --Exclude weekend 
     If datepart(dw,@NextWorkingDate) = 1 or datepart(dw,@NextWorkingDate) = 7 --Add 2 days if target date is either Saturday or Sunday 
      set @NextWorkingDate = @NextWorkingDate + 2 

     --Count no of holidays if falling within start date and nextwrking date 
     Select @AddDay = Count(*) from HolidayTable ST --Holiday list 
        where ST.OffDate between @StartDate+1 and @NextWorkingDate 
     Set @StartDate = @NextWorkingDate 
    End   

Select @NextWorkingDate 
관련 문제